Skip to content

Commit c57082c

Browse files
committed
Allow * wildcard
1 parent c0a19e9 commit c57082c

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

source/whitelist.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
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?
1111
const 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

1414
enum : 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

5762
bool 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

6382
extern "C" {

0 commit comments

Comments
 (0)