1//
2// ZipCommon.cpp
3//
4// Library: Zip
5// Package: Zip
6// Module: ZipCommon
7//
8// Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/Zip/ZipCommon.h"
16#include "Poco/Path.h"
17
18
19namespace Poco {
20namespace Zip {
21
22
23bool ZipCommon::isValidPath(const std::string& path)
24{
25 try
26 {
27 if (Path(path, Path::PATH_UNIX).isAbsolute() || Path(path, Path::PATH_WINDOWS).isAbsolute())
28 return false;
29 }
30 catch (...)
31 {
32 return false;
33 }
34
35 if (path == "..")
36 return false;
37 if ((path.size() >= 3) && path.compare(0, 3, "../") == 0)
38 return false;
39 if ((path.size() >= 3) && path.compare(0, 3, "..\\") == 0)
40 return false;
41 if (path.find("/../") != std::string::npos)
42 return false;
43 if (path.find("\\..\\") != std::string::npos)
44 return false;
45 if (path.find("/..\\") != std::string::npos)
46 return false;
47 if (path.find("\\../") != std::string::npos)
48 return false;
49 if ((path.size() >= 2) && path.compare(0, 2, "~/") == 0)
50 return false;
51
52 return true;
53}
54
55
56} } // namespace Poco::Zip
57