diff --git a/src/kits/package/PackageInfoParser.cpp b/src/kits/package/PackageInfoParser.cpp
index f684815..ed241e7 100644
a
|
b
|
|
1 | 1 | /* |
2 | 2 | * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de> |
| 3 | * Copyright 2016, Andrew Lindesay <apl@lindesay.co.nz> |
3 | 4 | * Distributed under the terms of the MIT License. |
4 | 5 | */ |
5 | 6 | |
… |
… |
BPackageInfo::Parser::_ParseList(ListElementParser& elementParser,
|
508 | 509 | |
509 | 510 | void |
510 | 511 | BPackageInfo::Parser::_ParseStringList(BStringList* value, |
511 | | bool requireResolvableName, bool convertToLowerCase) |
| 512 | bool requireResolvableName, bool convertToLowerCase, |
| 513 | StringValidator* stringValidator) |
512 | 514 | { |
513 | 515 | struct StringParser : public ListElementParser { |
514 | 516 | BStringList* value; |
515 | 517 | bool requireResolvableName; |
516 | 518 | bool convertToLowerCase; |
| 519 | StringValidator* stringValidator; |
517 | 520 | |
518 | 521 | StringParser(BStringList* value, bool requireResolvableName, |
519 | | bool convertToLowerCase) |
| 522 | bool convertToLowerCase, StringValidator* stringValidator) |
520 | 523 | : |
521 | 524 | value(value), |
522 | 525 | requireResolvableName(requireResolvableName), |
523 | | convertToLowerCase(convertToLowerCase) |
| 526 | convertToLowerCase(convertToLowerCase), |
| 527 | stringValidator(stringValidator) |
524 | 528 | { |
525 | 529 | } |
526 | 530 | |
… |
… |
BPackageInfo::Parser::_ParseStringList(BStringList* value,
|
541 | 545 | if (convertToLowerCase) |
542 | 546 | element.ToLower(); |
543 | 547 | |
| 548 | if (stringValidator != NULL) |
| 549 | stringValidator->Validate(element, token.pos); |
| 550 | |
544 | 551 | value->Add(element); |
545 | 552 | } |
546 | | } stringParser(value, requireResolvableName, convertToLowerCase); |
| 553 | } stringParser(value, requireResolvableName, convertToLowerCase, |
| 554 | stringValidator); |
547 | 555 | |
548 | 556 | _ParseList(stringParser, true); |
549 | 557 | } |
… |
… |
BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)
|
1008 | 1016 | break; |
1009 | 1017 | |
1010 | 1018 | case B_PACKAGE_INFO_URLS: |
1011 | | _ParseStringList(&packageInfo->fURLList); |
| 1019 | UrlStringValidator stringValidator; |
| 1020 | _ParseStringList(&packageInfo->fURLList, |
| 1021 | false, false, &stringValidator); |
1012 | 1022 | break; |
1013 | 1023 | |
1014 | 1024 | case B_PACKAGE_INFO_SOURCE_URLS: |
1015 | | _ParseStringList(&packageInfo->fSourceURLList); |
| 1025 | UrlStringValidator stringValidator; |
| 1026 | _ParseStringList(&packageInfo->fSourceURLList, |
| 1027 | false, false, &stringValidator); |
1016 | 1028 | break; |
1017 | 1029 | |
1018 | 1030 | case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: |
… |
… |
BPackageInfo::Parser::_IsValidResolvableName(const char* string,
|
1146 | 1158 | } |
1147 | 1159 | |
1148 | 1160 | |
| 1161 | /*static*/ bool |
| 1162 | BPackageInfo::Parser::UrlStringValidator::_HasUrlProtocol(const BString& url) |
| 1163 | { |
| 1164 | return url.StartsWith("http://") |
| 1165 | || url.StartsWith("https://") |
| 1166 | || url.StartsWith("ftp://") |
| 1167 | || url.StartsWith("file:/"); |
| 1168 | } |
| 1169 | |
| 1170 | |
| 1171 | /*static*/ bool |
| 1172 | BPackageInfo::Parser::UrlStringValidator::_IsUrlChar(char ch) |
| 1173 | { |
| 1174 | if ( (ch >= 'A' && ch <= 'Z') || |
| 1175 | (ch >= 'a' && ch <= 'z') || |
| 1176 | (ch >= '0' && ch <= '9') ) { |
| 1177 | return true; |
| 1178 | } |
| 1179 | |
| 1180 | switch (ch) { |
| 1181 | case '-': |
| 1182 | case '.': |
| 1183 | case '_': |
| 1184 | case '~': |
| 1185 | case ':': |
| 1186 | case '/': |
| 1187 | case '?': |
| 1188 | case '#': |
| 1189 | case '[': |
| 1190 | case ']': |
| 1191 | case '@': |
| 1192 | case '!': |
| 1193 | case '$': |
| 1194 | case '&': |
| 1195 | case '\'': |
| 1196 | case '(': |
| 1197 | case ')': |
| 1198 | case '*': |
| 1199 | case '+': |
| 1200 | case ',': |
| 1201 | case ';': |
| 1202 | case '=': |
| 1203 | return true; |
| 1204 | } |
| 1205 | |
| 1206 | return false; |
| 1207 | } |
| 1208 | |
| 1209 | |
| 1210 | void |
| 1211 | BPackageInfo::Parser::UrlStringValidator::Validate(const BString& url, const char *pos) |
| 1212 | { |
| 1213 | for (int32 i = 0; i < url.Length(); i++) { |
| 1214 | if (!_IsUrlChar(url.ByteAt(i))) |
| 1215 | throw ParseError("invalid character in url", pos); |
| 1216 | } |
| 1217 | |
| 1218 | if (!_HasUrlProtocol(url)) |
| 1219 | throw ParseError("missing or unrecognized protocol in url", pos); |
| 1220 | } |
| 1221 | |
| 1222 | |
1149 | 1223 | } // namespace BPackageKit |
diff --git a/src/kits/package/PackageInfoParser.h b/src/kits/package/PackageInfoParser.h
index 6824b9e..3cdf82e 100644
a
|
b
|
|
1 | 1 | /* |
2 | 2 | * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de> |
| 3 | * Copyright 2016, Andrew Lindesay <apl@lindesay.co.nz> |
3 | 4 | * Distributed under the terms of the MIT License. |
4 | 5 | */ |
5 | 6 | #ifndef PACKAGE_INFO_PARSER_H |
… |
… |
public:
|
31 | 32 | BPackageResolvableExpression& _expression); |
32 | 33 | |
33 | 34 | private: |
| 35 | struct UrlStringValidator; |
| 36 | struct StringValidator; |
34 | 37 | struct ParseError; |
35 | 38 | struct Token; |
36 | 39 | struct ListElementParser; |
… |
… |
private:
|
74 | 77 | bool allowSingleNonListElement); |
75 | 78 | void _ParseStringList(BStringList* value, |
76 | 79 | bool requireResolvableName = false, |
77 | | bool convertToLowerCase = false); |
| 80 | bool convertToLowerCase = false, |
| 81 | StringValidator* stringValidator = NULL); |
78 | 82 | void _ParseResolvableList( |
79 | 83 | BObjectList<BPackageResolvable>* value); |
80 | 84 | void _ParseResolvableExprList( |
… |
… |
struct BPackageInfo::Parser::ListElementParser {
|
152 | 156 | }; |
153 | 157 | |
154 | 158 | |
| 159 | struct BPackageInfo::Parser::StringValidator { |
| 160 | public: |
| 161 | virtual void Validate(const BString &string, const char *pos) = 0; |
| 162 | }; |
| 163 | |
| 164 | |
| 165 | struct BPackageInfo::Parser::UrlStringValidator : public BPackageInfo::Parser::StringValidator { |
| 166 | private: |
| 167 | static bool _HasUrlProtocol(const BString& url); |
| 168 | static bool _IsUrlChar(char ch); |
| 169 | |
| 170 | public: |
| 171 | virtual void Validate(const BString &string, const char *pos); |
| 172 | }; |
| 173 | |
| 174 | |
155 | 175 | } // namespace BPackageKit |
156 | 176 | |
157 | 177 | |