11#undef getaddrinfo
22
33#include " socket.h"
4+ #include < vector>
45#include < map>
5- #include < set>
66#include < fstream>
77#include < sstream>
88#include < regex>
99
1010// Somewhere glua can't read?
1111const char * whitelistDir = " ../gm_socket_whitelist.txt" ;
12- std::map<std::string, std::set <std::string > > whitelist;
12+ std::map<std::string, std::vector <std::regex > > whitelist;
1313
1414enum : int
1515{
@@ -27,14 +27,19 @@ int parseWhitelist()
2727 filereader << input.rdbuf ();
2828 std::string filedata = filereader.str ();
2929 std::regex line_parser (" (?:(?!\r ?\n ).)+" );
30- std::regex entry_parser (" ^[ \\ t]*([\\ w\\ .-]+)\\ :(\\ d+)[ \\ t]*$" );
30+ std::regex entry_parser (" ^[ \\ t]*([\\ w\\ .\\ *-]+)\\ :(\\ d+)[ \\ t]*$" );
31+ std::regex wildcard (" \\ *" );
32+ std::regex dot (" \\ ." );
3133 for (std::sregex_iterator line = std::sregex_iterator (filedata.begin (), filedata.end (), line_parser), end = std::sregex_iterator (); line != end; ++line)
3234 {
3335 const std::string& linestr = line->operator [](0 );
3436 std::smatch match;
3537 if (std::regex_match (linestr, match, entry_parser))
3638 {
37- whitelist[match[1 ].str ()].insert (match[2 ].str ());
39+ std::string domain = match[1 ];
40+ domain = std::regex_replace (domain, wildcard, " [\\ w-]+" );
41+ domain = std::regex_replace (domain, dot, " \\ ." );
42+ whitelist[match[2 ].str ()].push_back (std::regex (domain));
3843 }
3944 }
4045 if (whitelist.empty ())
@@ -56,8 +61,22 @@ void clearWhitelist()
5661
5762bool isSafe (const char * pNodeName, const char * pServiceName)
5863{
59- std::map<std::string, std::set<std::string> >::iterator domain = whitelist.find (pNodeName);
60- return domain != whitelist.end () && domain->second .count (pServiceName)==1 ;
64+ std::map<std::string, std::vector<std::regex> >::iterator domains = whitelist.find (pServiceName);
65+ if (domains != whitelist.end ())
66+ {
67+ for (auto i = domains->second .begin (), end = domains->second .end (); i != end; ++i)
68+ {
69+ if (std::regex_match (pNodeName, *i))
70+ {
71+ return true ;
72+ }
73+ }
74+ return false ;
75+ }
76+ else
77+ {
78+ return false ;
79+ }
6180}
6281
6382extern " C" {
0 commit comments