Directory: | cvmfs/ |
---|---|
File: | cvmfs/sanitizer.h |
Date: | 2025-06-22 02:36:02 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 10 | 13 | 76.9% |
Branches: | 12 | 32 | 37.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /** | ||
2 | * This file is part of the CernVM File System. | ||
3 | */ | ||
4 | |||
5 | #ifndef CVMFS_SANITIZER_H_ | ||
6 | #define CVMFS_SANITIZER_H_ | ||
7 | |||
8 | #include <string> | ||
9 | #include <vector> | ||
10 | |||
11 | #ifdef CVMFS_NAMESPACE_GUARD | ||
12 | namespace CVMFS_NAMESPACE_GUARD { | ||
13 | #endif | ||
14 | |||
15 | namespace sanitizer { | ||
16 | |||
17 | class CharRange { | ||
18 | public: | ||
19 | CharRange(const char range_begin, const char range_end); | ||
20 | explicit CharRange(const char single_char); | ||
21 | bool InRange(const char c) const; | ||
22 | |||
23 | private: | ||
24 | char range_begin_; | ||
25 | char range_end_; | ||
26 | }; | ||
27 | |||
28 | |||
29 | class InputSanitizer { | ||
30 | public: | ||
31 | // whitelist is of the form "az AZ _ - 09" | ||
32 | // Any other format will abort the program | ||
33 | explicit InputSanitizer(const std::string &whitelist); | ||
34 | InputSanitizer(const std::string &whitelist, int max_length); | ||
35 | 72584 | virtual ~InputSanitizer() { } | |
36 | |||
37 | std::string Filter(const std::string &input) const; | ||
38 | bool IsValid(const std::string &input) const; | ||
39 | |||
40 | protected: | ||
41 | 38159 | bool Sanitize(const std::string &input, std::string *filtered_output) const { | |
42 | 38159 | return Sanitize(input.begin(), input.end(), filtered_output); | |
43 | } | ||
44 | virtual bool Sanitize(std::string::const_iterator begin, | ||
45 | std::string::const_iterator end, | ||
46 | std::string *filtered_output) const; | ||
47 | bool CheckRanges(const char chr) const; | ||
48 | |||
49 | private: | ||
50 | void InitValidRanges(const std::string &whitelist); | ||
51 | |||
52 | int max_length_; | ||
53 | std::vector<CharRange> valid_ranges_; | ||
54 | }; | ||
55 | |||
56 | |||
57 | class AlphaNumSanitizer : public InputSanitizer { | ||
58 | public: | ||
59 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | AlphaNumSanitizer() : InputSanitizer("az AZ 09") { } |
60 | }; | ||
61 | |||
62 | |||
63 | class UuidSanitizer : public InputSanitizer { | ||
64 | public: | ||
65 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | UuidSanitizer() : InputSanitizer("af AF 09 -") { } |
66 | }; | ||
67 | |||
68 | |||
69 | class CacheInstanceSanitizer : public InputSanitizer { | ||
70 | public: | ||
71 |
2/4✓ Branch 2 taken 735 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 735 times.
✗ Branch 6 not taken.
|
735 | CacheInstanceSanitizer() : InputSanitizer("az AZ 09 _") { } |
72 | }; | ||
73 | |||
74 | |||
75 | class RepositorySanitizer : public InputSanitizer { | ||
76 | public: | ||
77 |
2/4✓ Branch 2 taken 147 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 147 times.
✗ Branch 6 not taken.
|
147 | RepositorySanitizer() : InputSanitizer("az AZ 09 - _ .", 60) { } |
78 | }; | ||
79 | |||
80 | |||
81 | class AuthzSchemaSanitizer : public InputSanitizer { | ||
82 | public: | ||
83 | ✗ | AuthzSchemaSanitizer() : InputSanitizer("az AZ 09 - _ .") { } | |
84 | }; | ||
85 | |||
86 | |||
87 | // Also update is_valid_branch in cvmfs_server | ||
88 | class BranchSanitizer : public InputSanitizer { | ||
89 | public: | ||
90 | ✗ | BranchSanitizer() : InputSanitizer("az AZ 09 - _ . @ /") { } | |
91 | }; | ||
92 | |||
93 | |||
94 | class TagSanitizer : public InputSanitizer { | ||
95 | public: | ||
96 | ✗ | TagSanitizer() : InputSanitizer("az AZ 09 - _ . / :") { } | |
97 | }; | ||
98 | |||
99 | |||
100 | class IntegerSanitizer : public InputSanitizer { | ||
101 | public: | ||
102 |
2/4✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 138 times.
✗ Branch 6 not taken.
|
138 | IntegerSanitizer() : InputSanitizer("09") { } |
103 | |||
104 | protected: | ||
105 | virtual bool Sanitize(std::string::const_iterator begin, | ||
106 | std::string::const_iterator end, | ||
107 | std::string *filtered_output) const; | ||
108 | }; | ||
109 | |||
110 | |||
111 | class PositiveIntegerSanitizer : public IntegerSanitizer { | ||
112 | public: | ||
113 | 49 | PositiveIntegerSanitizer() : IntegerSanitizer() { } | |
114 | |||
115 | protected: | ||
116 | virtual bool Sanitize(std::string::const_iterator begin, | ||
117 | std::string::const_iterator end, | ||
118 | std::string *filtered_output) const; | ||
119 | }; | ||
120 | |||
121 | |||
122 | /** | ||
123 | * Accepts both normal base64 and url conformant base64. | ||
124 | */ | ||
125 | class Base64Sanitizer : public InputSanitizer { | ||
126 | public: | ||
127 |
2/4✓ Branch 2 taken 49 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 49 times.
✗ Branch 6 not taken.
|
49 | Base64Sanitizer() : InputSanitizer("az AZ 09 + / - _ =") { } |
128 | }; | ||
129 | |||
130 | /** | ||
131 | * There could be more on the whitelist but this is already sufficient for the | ||
132 | * octopus web service. It includes the whitelist for valid repositories. | ||
133 | */ | ||
134 | class UriSanitizer : public InputSanitizer { | ||
135 | public: | ||
136 | UriSanitizer() : InputSanitizer("az AZ 09 . - _ /") { } | ||
137 | }; | ||
138 | |||
139 | } // namespace sanitizer | ||
140 | |||
141 | #ifdef CVMFS_NAMESPACE_GUARD | ||
142 | } // namespace CVMFS_NAMESPACE_GUARD | ||
143 | #endif | ||
144 | |||
145 | #endif // CVMFS_SANITIZER_H_ | ||
146 |