Во-первых, вам нужно нормализовать окончательный путь . Это удалит все .
и ..
s в пути. Затем вам нужно проверить, есть ли какие-либо несоответствия в диапазоне итераторов каталога относительно root
. И для этого есть стандартный библиотечный алгоритм .
Итак, в целом код выглядит так:
std::optional<fs::path> MakeAbsolute(const fs::path &root, const fs::path &userPath)
{
auto finalPath = (root / userPath).lexically_normal();
auto[rootEnd, nothing] = std::mismatch(root.begin(), root.end(), finalPath.begin());
if(rootEnd != root.end())
return std::nullopt;
return finalPath;
}
Обратите внимание, что это работает только теоретически; пользователь мог использовать shenlink shenanigans в каталоге root, чтобы выйти из каталога root. Вам нужно будет использовать canonical
вместо lexically_normal
, чтобы этого не произошло. Однако canonical
требует , чтобы существовал путь, поэтому, если это путь к файлу / каталогу, который необходимо создать, он не будет работать.