1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:critical reason:data-parser
4
5#ifndef QFILESYSTEMENGINE_P_H
6#define QFILESYSTEMENGINE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qfile.h"
20#include "qfilesystementry_p.h"
21#include "qfilesystemmetadata_p.h"
22#include <QtCore/private/qsystemerror_p.h>
23
24#include <memory>
25#include <optional>
26
27QT_BEGIN_NAMESPACE
28
29#define Q_RETURN_ON_INVALID_FILENAME(message, result) \
30 { \
31 qWarning(message); \
32 errno = EINVAL; \
33 return (result); \
34 }
35
36inline bool qIsFilenameBroken(const QByteArray &name)
37{
38 return name.contains(c: '\0');
39}
40
41inline bool qIsFilenameBroken(const QString &name)
42{
43 return name.contains(c: QLatin1Char('\0'));
44}
45
46inline bool qIsFilenameBroken(const QFileSystemEntry &entry)
47{
48 return qIsFilenameBroken(name: entry.nativeFilePath());
49}
50
51#define Q_CHECK_FILE_NAME(name, result) \
52 do { \
53 if (Q_UNLIKELY((name).isEmpty())) \
54 Q_RETURN_ON_INVALID_FILENAME("Empty filename passed to function", (result)); \
55 if (Q_UNLIKELY(qIsFilenameBroken(name))) \
56 Q_RETURN_ON_INVALID_FILENAME("Broken filename passed to function", (result)); \
57 } while (false)
58
59Q_CORE_EXPORT bool qt_isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);
60
61class Q_AUTOTEST_EXPORT QFileSystemEngine
62{
63public:
64 using TriStateResult = QAbstractFileEngine::TriStateResult;
65
66 static bool isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);
67
68 static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
69 static QFileSystemEntry getRawLinkPath(const QFileSystemEntry &link,
70 QFileSystemMetaData &data);
71 static QFileSystemEntry getJunctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
72 static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
73 static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);
74 static QByteArray id(const QFileSystemEntry &entry);
75 static QString resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
76 static QString resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
77
78#if defined(Q_OS_UNIX)
79 static QString resolveUserName(uint userId);
80 static QString resolveGroupName(uint groupId);
81#endif
82
83#if defined(Q_OS_DARWIN)
84 static QString bundleName(const QFileSystemEntry &entry);
85#else
86 static QString bundleName(const QFileSystemEntry &) { return QString(); }
87#endif
88
89 static bool fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
90 QFileSystemMetaData::MetaDataFlags what);
91#if defined(Q_OS_UNIX)
92 static TriStateResult cloneFile(int srcfd, int dstfd, const QFileSystemMetaData &knownData);
93 static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
94 static QByteArray id(int fd);
95 static bool setFileTime(int fd, const QDateTime &newDate,
96 QFile::FileTime whatTime, QSystemError &error);
97 static bool setPermissions(int fd, QFile::Permissions permissions, QSystemError &error);
98#endif
99#if defined(Q_OS_WIN)
100 static QFileSystemEntry junctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
101 static bool uncListSharesOnServer(const QString &server, QStringList *list); //Used also by QFSFileEngineIterator::hasNext()
102 static bool fillMetaData(int fd, QFileSystemMetaData &data,
103 QFileSystemMetaData::MetaDataFlags what);
104 static bool fillMetaData(HANDLE fHandle, QFileSystemMetaData &data,
105 QFileSystemMetaData::MetaDataFlags what);
106 static bool fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
107 QFileSystemMetaData::MetaDataFlags what);
108 static QByteArray id(HANDLE fHandle);
109 static bool setFileTime(HANDLE fHandle, const QDateTime &newDate,
110 QFile::FileTime whatTime, QSystemError &error);
111 static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
112 static QString nativeAbsoluteFilePath(const QString &path);
113 static bool isDirPath(const QString &path, bool *existed);
114#endif
115 //homePath, rootPath and tempPath shall return clean paths
116 static QString homePath();
117 static QString rootPath();
118 static QString tempPath();
119
120 static bool createDirectory(const QFileSystemEntry &entry, bool createParents,
121 std::optional<QFile::Permissions> permissions = std::nullopt)
122 {
123 if (createParents)
124 return mkpath(entry, permissions);
125 return mkdir(entry, permissions);
126 }
127
128 static bool mkdir(const QFileSystemEntry &entry,
129 std::optional<QFile::Permissions> permissions = std::nullopt);
130 static bool mkpath(const QFileSystemEntry &entry,
131 std::optional<QFile::Permissions> permissions = std::nullopt);
132
133 static bool removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents)
134 {
135 if (removeEmptyParents)
136 return rmpath(entry);
137 return rmdir(entry);
138 }
139
140 static bool rmdir(const QFileSystemEntry &entry);
141 static bool rmpath(const QFileSystemEntry &entry);
142
143 static bool createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
144
145 static bool copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
146 static bool supportsMoveFileToTrash();
147 static bool moveFileToTrash(const QFileSystemEntry &source, QFileSystemEntry &newLocation, QSystemError &error);
148 static bool renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
149 static bool renameOverwriteFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
150 static bool removeFile(const QFileSystemEntry &entry, QSystemError &error);
151
152 static bool setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions,
153 QSystemError &error);
154
155 // unused, therefore not implemented
156 static bool setFileTime(const QFileSystemEntry &entry, const QDateTime &newDate,
157 QFile::FileTime whatTime, QSystemError &error);
158
159 static bool setCurrentPath(const QFileSystemEntry &entry);
160 static QFileSystemEntry currentPath();
161
162 static std::unique_ptr<QAbstractFileEngine>
163 createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data);
164
165private:
166 static QString slowCanonicalized(const QString &path);
167#if defined(Q_OS_WIN)
168 static void clearWinStatData(QFileSystemMetaData &data);
169#endif
170};
171
172QT_END_NAMESPACE
173
174#endif // include guard
175

source code of qtbase/src/corelib/io/qfilesystemengine_p.h