Skip to content

Commit 59080e1

Browse files
committed
Complete the restructuring of the DMR access control.
1 parent a3d28f7 commit 59080e1

9 files changed

+59
-325
lines changed

Conf.cpp

+5-103
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,7 @@ m_dmrColorCode(2U),
107107
m_dmrSelfOnly(false),
108108
m_dmrPrefixes(),
109109
m_dmrBlackList(),
110-
m_dmrDstIdBlacklistSlot1RF(),
111-
m_dmrDstIdBlacklistSlot2RF(),
112-
m_dmrDstIdWhitelistSlot1RF(),
113-
m_dmrDstIdWhitelistSlot2RF(),
114-
m_dmrDstIdBlacklistSlot1NET(),
115-
m_dmrDstIdBlacklistSlot2NET(),
116-
m_dmrDstIdWhitelistSlot1NET(),
117-
m_dmrDstIdWhitelistSlot2NET(),
110+
m_dmrWhiteList(),
118111
m_dmrCallHang(3U),
119112
m_dmrTXHang(4U),
120113
m_fusionEnabled(false),
@@ -395,68 +388,12 @@ bool CConf::read()
395388
m_dmrBlackList.push_back(id);
396389
p = ::strtok(NULL, ",\r\n");
397390
}
398-
} else if (::strcmp(key, "DstIdBlackListSlot1RF") == 0) {
391+
} else if (::strcmp(key, "WhiteList") == 0) {
399392
char* p = ::strtok(value, ",\r\n");
400393
while (p != NULL) {
401394
unsigned int id = (unsigned int)::atoi(p);
402395
if (id > 0U)
403-
m_dmrDstIdBlacklistSlot1RF.push_back(id);
404-
p = ::strtok(NULL, ",\r\n");
405-
}
406-
} else if (::strcmp(key, "DstIdBlackListSlot2RF") == 0) {
407-
char* p = ::strtok(value, ",\r\n");
408-
while (p != NULL) {
409-
unsigned int id = (unsigned int)::atoi(p);
410-
if (id > 0U)
411-
m_dmrDstIdBlacklistSlot2RF.push_back(id);
412-
p = ::strtok(NULL, ",\r\n");
413-
}
414-
} else if (::strcmp(key, "DstIdWhiteListSlot1RF") == 0) {
415-
char* p = ::strtok(value, ",\r\n");
416-
while (p != NULL) {
417-
unsigned int id = (unsigned int)::atoi(p);
418-
if (id > 0U)
419-
m_dmrDstIdWhitelistSlot1RF.push_back(id);
420-
p = ::strtok(NULL, ",\r\n");
421-
}
422-
} else if (::strcmp(key, "DstIdWhiteListSlot2RF") == 0) {
423-
char* p = ::strtok(value, ",\r\n");
424-
while (p != NULL) {
425-
unsigned int id = (unsigned int)::atoi(p);
426-
if (id > 0U)
427-
m_dmrDstIdWhitelistSlot2RF.push_back(id);
428-
p = ::strtok(NULL, ",\r\n");
429-
}
430-
} else if (::strcmp(key, "DstIdBlackListSlot1NET") == 0) {
431-
char* p = ::strtok(value, ",\r\n");
432-
while (p != NULL) {
433-
unsigned int id = (unsigned int)::atoi(p);
434-
if (id > 0U)
435-
m_dmrDstIdBlacklistSlot1NET.push_back(id);
436-
p = ::strtok(NULL, ",\r\n");
437-
}
438-
} else if (::strcmp(key, "DstIdBlackListSlot2NET") == 0) {
439-
char* p = ::strtok(value, ",\r\n");
440-
while (p != NULL) {
441-
unsigned int id = (unsigned int)::atoi(p);
442-
if (id > 0U)
443-
m_dmrDstIdBlacklistSlot2NET.push_back(id);
444-
p = ::strtok(NULL, ",\r\n");
445-
}
446-
} else if (::strcmp(key, "DstIdWhiteListSlot1NET") == 0) {
447-
char* p = ::strtok(value, ",\r\n");
448-
while (p != NULL) {
449-
unsigned int id = (unsigned int)::atoi(p);
450-
if (id > 0U)
451-
m_dmrDstIdWhitelistSlot1NET.push_back(id);
452-
p = ::strtok(NULL, ",\r\n");
453-
}
454-
} else if (::strcmp(key, "DstIdWhiteListSlot2NET") == 0) {
455-
char* p = ::strtok(value, ",\r\n");
456-
while (p != NULL) {
457-
unsigned int id = (unsigned int)::atoi(p);
458-
if (id > 0U)
459-
m_dmrDstIdWhitelistSlot2NET.push_back(id);
396+
m_dmrWhiteList.push_back(id);
460397
p = ::strtok(NULL, ",\r\n");
461398
}
462399
} else if (::strcmp(key, "TXHang") == 0)
@@ -867,44 +804,9 @@ std::vector<unsigned int> CConf::getDMRBlackList() const
867804
return m_dmrBlackList;
868805
}
869806

870-
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot1RF() const
871-
{
872-
return m_dmrDstIdBlacklistSlot1RF;
873-
}
874-
875-
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot2RF() const
876-
{
877-
return m_dmrDstIdBlacklistSlot2RF;
878-
}
879-
880-
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot1RF() const
881-
{
882-
return m_dmrDstIdWhitelistSlot1RF;
883-
}
884-
885-
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot2RF() const
886-
{
887-
return m_dmrDstIdWhitelistSlot2RF;
888-
}
889-
890-
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot1NET() const
891-
{
892-
return m_dmrDstIdBlacklistSlot1NET;
893-
}
894-
895-
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot2NET() const
896-
{
897-
return m_dmrDstIdBlacklistSlot2NET;
898-
}
899-
900-
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot1NET() const
901-
{
902-
return m_dmrDstIdWhitelistSlot1NET;
903-
}
904-
905-
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot2NET() const
807+
std::vector<unsigned int> CConf::getDMRWhiteList() const
906808
{
907-
return m_dmrDstIdWhitelistSlot2NET;
809+
return m_dmrWhiteList;
908810
}
909811

910812
unsigned int CConf::getDMRCallHang() const

Conf.h

+2-16
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,7 @@ class CConf
100100
bool getDMRSelfOnly() const;
101101
std::vector<unsigned int> getDMRPrefixes() const;
102102
std::vector<unsigned int> getDMRBlackList() const;
103-
std::vector<unsigned int> getDMRDstIdBlacklistSlot1RF() const;
104-
std::vector<unsigned int> getDMRDstIdBlacklistSlot2RF() const;
105-
std::vector<unsigned int> getDMRDstIdWhitelistSlot1RF() const;
106-
std::vector<unsigned int> getDMRDstIdWhitelistSlot2RF() const;
107-
std::vector<unsigned int> getDMRDstIdBlacklistSlot1NET() const;
108-
std::vector<unsigned int> getDMRDstIdBlacklistSlot2NET() const;
109-
std::vector<unsigned int> getDMRDstIdWhitelistSlot1NET() const;
110-
std::vector<unsigned int> getDMRDstIdWhitelistSlot2NET() const;
103+
std::vector<unsigned int> getDMRWhiteList() const;
111104
unsigned int getDMRCallHang() const;
112105
unsigned int getDMRTXHang() const;
113106

@@ -253,14 +246,7 @@ class CConf
253246
bool m_dmrSelfOnly;
254247
std::vector<unsigned int> m_dmrPrefixes;
255248
std::vector<unsigned int> m_dmrBlackList;
256-
std::vector<unsigned int> m_dmrDstIdBlacklistSlot1RF;
257-
std::vector<unsigned int> m_dmrDstIdBlacklistSlot2RF;
258-
std::vector<unsigned int> m_dmrDstIdWhitelistSlot1RF;
259-
std::vector<unsigned int> m_dmrDstIdWhitelistSlot2RF;
260-
std::vector<unsigned int> m_dmrDstIdBlacklistSlot1NET;
261-
std::vector<unsigned int> m_dmrDstIdBlacklistSlot2NET;
262-
std::vector<unsigned int> m_dmrDstIdWhitelistSlot1NET;
263-
std::vector<unsigned int> m_dmrDstIdWhitelistSlot2NET;
249+
std::vector<unsigned int> m_dmrWhiteList;
264250
unsigned int m_dmrCallHang;
265251
unsigned int m_dmrTXHang;
266252

DMRAccessControl.cpp

+14-137
Original file line numberDiff line numberDiff line change
@@ -20,165 +20,42 @@
2020
#include <vector>
2121
#include <cstring>
2222

23-
24-
std::vector<unsigned int> CDMRAccessControl::m_dstBlackListSlot1RF;
25-
std::vector<unsigned int> CDMRAccessControl::m_dstBlackListSlot2RF;
26-
std::vector<unsigned int> CDMRAccessControl::m_dstWhiteListSlot1RF;
27-
std::vector<unsigned int> CDMRAccessControl::m_dstWhiteListSlot2RF;
28-
29-
std::vector<unsigned int> CDMRAccessControl::m_dstBlackListSlot1NET;
30-
std::vector<unsigned int> CDMRAccessControl::m_dstBlackListSlot2NET;
31-
std::vector<unsigned int> CDMRAccessControl::m_dstWhiteListSlot1NET;
32-
std::vector<unsigned int> CDMRAccessControl::m_dstWhiteListSlot2NET;
33-
34-
std::vector<unsigned int> CDMRAccessControl::m_srcIdBlacklist;
23+
std::vector<unsigned int> CDMRAccessControl::m_blackList;
24+
std::vector<unsigned int> CDMRAccessControl::m_whiteList;
3525

3626
std::vector<unsigned int> CDMRAccessControl::m_prefixes;
3727

3828
bool CDMRAccessControl::m_selfOnly = false;
3929

4030
unsigned int CDMRAccessControl::m_id = 0U;
4131

42-
void CDMRAccessControl::init(const std::vector<unsigned int>& dstIdBlacklistSlot1RF, const std::vector<unsigned int>& dstIdWhitelistSlot1RF, const std::vector<unsigned int>& dstIdBlacklistSlot2RF, const std::vector<unsigned int>& dstIdWhitelistSlot2RF, const std::vector<unsigned int>& dstIdBlacklistSlot1NET, const std::vector<unsigned int>& dstIdWhitelistSlot1NET, const std::vector<unsigned int>& dstIdBlacklistSlot2NET, const std::vector<unsigned int>& dstIdWhitelistSlot2NET, const std::vector<unsigned int>& srcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& prefixes, unsigned int id)
32+
void CDMRAccessControl::init(const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, bool selfOnly, const std::vector<unsigned int>& prefixes, unsigned int id)
4333
{
44-
m_dstBlackListSlot1RF = dstIdBlacklistSlot1RF;
45-
m_dstWhiteListSlot1RF = dstIdWhitelistSlot1RF;
46-
m_dstBlackListSlot2RF = dstIdBlacklistSlot2RF;
47-
m_dstWhiteListSlot2RF = dstIdWhitelistSlot2RF;
48-
m_dstBlackListSlot1NET = dstIdBlacklistSlot1NET;
49-
m_dstWhiteListSlot1NET = dstIdWhitelistSlot1NET;
50-
m_dstBlackListSlot2NET = dstIdBlacklistSlot2NET;
51-
m_dstWhiteListSlot2NET = dstIdWhitelistSlot2NET;
34+
m_blackList = blacklist;
35+
m_whiteList = whitelist;
5236
}
5337

54-
bool CDMRAccessControl::dstIdBlacklist(unsigned int did, unsigned int slot, bool network)
55-
{
56-
static std::vector<unsigned int> blacklist;
57-
58-
if (slot == 1U) {
59-
if (network)
60-
blacklist = m_dstBlackListSlot1NET;
61-
else
62-
blacklist = m_dstBlackListSlot1RF;
63-
} else {
64-
if (network)
65-
blacklist = m_dstBlackListSlot2NET;
66-
else
67-
blacklist = m_dstBlackListSlot2RF;
68-
}
69-
70-
return std::find(blacklist.begin(), blacklist.end(), did) != blacklist.end();
71-
}
72-
73-
bool CDMRAccessControl::dstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k, bool network)
74-
{
75-
if (network) {
76-
if (slot == 1U) {
77-
if (m_dstWhiteListSlot1NET.size() == 0U)
78-
return true;
79-
80-
// No reflectors on slot1, so we only allow all IDs over 99999 unless specifically whitelisted.
81-
// Allow traffic to TG0 as I think this is a special case - need to confirm
82-
if (gt4k) {
83-
if (std::find(m_dstWhiteListSlot1NET.begin(), m_dstWhiteListSlot1NET.end(), did) != m_dstWhiteListSlot1NET.end() || did >= 99999U || did == 0)
84-
return true;
85-
} else {
86-
if (std::find(m_dstWhiteListSlot1NET.begin(), m_dstWhiteListSlot1NET.end(), did) != m_dstWhiteListSlot1NET.end() || did == 0)
87-
return true;
88-
}
89-
} else {
90-
if (m_dstWhiteListSlot2NET.size() == 0U)
91-
return true;
92-
93-
// On slot2 we allow reflector control IDs, but not secondary TG IDs unless specifically listed. Also allow echo.
94-
if (gt4k) {
95-
if (std::find(m_dstWhiteListSlot2NET.begin(), m_dstWhiteListSlot2NET.end(), did) != m_dstWhiteListSlot2NET.end() || did == 0)
96-
return true;
97-
// If dstId in secondary TG range or whitelist
98-
else if (did >= 4000) {
99-
if (did > 5000U && did < 10000U)
100-
return false;
101-
else
102-
return true;
103-
}
104-
} else {
105-
if (std::find(m_dstWhiteListSlot2NET.begin(), m_dstWhiteListSlot2NET.end(), did) != m_dstWhiteListSlot2NET.end())
106-
return true;
107-
}
108-
}
109-
110-
return false;
111-
} else {
112-
if (slot == 1U) {
113-
if (m_dstWhiteListSlot1RF.size() == 0U)
114-
return true;
115-
116-
// No reflectors on slot1, so we only allow all IDs over 99999 unless specifically whitelisted.
117-
// Allow traffic to TG0 as I think this is a special case - need to confirm
118-
if (gt4k) {
119-
if (std::find(m_dstWhiteListSlot1RF.begin(), m_dstWhiteListSlot1RF.end(), did) != m_dstWhiteListSlot1RF.end() || did >= 99999U || did == 0)
120-
return true;
121-
} else {
122-
if (std::find(m_dstWhiteListSlot1RF.begin(), m_dstWhiteListSlot1RF.end(), did) != m_dstWhiteListSlot1RF.end() || did == 0)
123-
return true;
124-
}
125-
} else {
126-
if (m_dstWhiteListSlot2RF.size() == 0U)
127-
return true;
128-
129-
// On slot2 we allow reflector control IDs, but not secondary TG IDs unless specifically listed. Also allow echo.
130-
if (gt4k) {
131-
if (std::find(m_dstWhiteListSlot2RF.begin(), m_dstWhiteListSlot2RF.end(), did) != m_dstWhiteListSlot2RF.end() || did == 0)
132-
return true;
133-
// If dstId in secondary TG range or whitelist
134-
else if (did >= 4000U) {
135-
if (did > 5000U && did < 10000U)
136-
return false;
137-
else
138-
return true;
139-
}
140-
} else {
141-
if (std::find(m_dstWhiteListSlot2RF.begin(), m_dstWhiteListSlot2RF.end(), did) != m_dstWhiteListSlot2RF.end())
142-
return true;
143-
}
144-
}
145-
146-
return false;
147-
}
148-
}
149-
150-
bool CDMRAccessControl::validateSrcId(unsigned int id)
38+
bool CDMRAccessControl::validateId(unsigned int id)
15139
{
15240
if (m_selfOnly) {
15341
return id == m_id;
15442
} else {
155-
if (std::find(m_srcIdBlacklist.begin(), m_srcIdBlacklist.end(), id) != m_srcIdBlacklist.end())
43+
if (std::find(m_blackList.begin(), m_blackList.end(), id) != m_blackList.end())
15644
return false;
15745

15846
unsigned int prefix = id / 10000U;
15947
if (prefix == 0U || prefix > 999U)
16048
return false;
16149

162-
if (m_prefixes.size() == 0U)
163-
return true;
50+
if (!m_prefixes.empty()) {
51+
bool ret = std::find(m_prefixes.begin(), m_prefixes.end(), prefix) == m_prefixes.end();
52+
if (!ret)
53+
return false;
54+
}
16455

165-
return std::find(m_prefixes.begin(), m_prefixes.end(), prefix) != m_prefixes.end();
166-
}
167-
}
56+
if (!m_whiteList.empty())
57+
return std::find(m_whiteList.begin(), m_whiteList.end(), id) != m_whiteList.end();
16858

169-
bool CDMRAccessControl::validateAccess(unsigned int src_id, unsigned int dst_id, unsigned int slot, bool network)
170-
{
171-
// source ID validation is only applied to RF traffic
172-
if (!network && !CDMRAccessControl::validateSrcId(src_id)) {
173-
LogMessage("DMR Slot %u, invalid access attempt from %u (blacklisted)", slot, src_id);
174-
return false;
175-
} else if (CDMRAccessControl::dstIdBlacklist(dst_id, slot, network)) {
176-
LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG blacklisted)", slot, dst_id);
177-
return false;
178-
} else if (!CDMRAccessControl::dstIdWhitelist(dst_id, slot, true, network)) {
179-
LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG not in whitelist)", slot, dst_id);
180-
return false;
181-
} else {
18259
return true;
18360
}
18461
}

DMRAccessControl.h

+4-18
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,18 @@
2121

2222
class CDMRAccessControl {
2323
public:
24-
static bool validateAccess(unsigned int srcId, unsigned int dstId, unsigned int slot, bool network);
24+
static bool validateId(unsigned int id);
2525

26-
static bool validateSrcId(unsigned int id);
27-
28-
static void init(const std::vector<unsigned int>& dstIdBlacklistSlot1RF, const std::vector<unsigned int>& dstIdWhitelistSlot1RF, const std::vector<unsigned int>& dstIdBlacklistSlot2RF, const std::vector<unsigned int>& dstIdWhitelistSlot2RF, const std::vector<unsigned int>& dstIdBlacklistSlot1NET, const std::vector<unsigned int>& dstIdWhitelistSlot1NET, const std::vector<unsigned int>& dstIdBlacklistSlot2NET, const std::vector<unsigned int>& dstIdWhitelistSlot2NET, const std::vector<unsigned int>& srcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& prefixes, unsigned int id);
26+
static void init(const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, bool selfOnly, const std::vector<unsigned int>& prefixes, unsigned int id);
2927

3028
private:
31-
static std::vector<unsigned int> m_dstBlackListSlot1RF;
32-
static std::vector<unsigned int> m_dstBlackListSlot2RF;
33-
static std::vector<unsigned int> m_dstWhiteListSlot1RF;
34-
static std::vector<unsigned int> m_dstWhiteListSlot2RF;
35-
36-
static std::vector<unsigned int> m_dstBlackListSlot1NET;
37-
static std::vector<unsigned int> m_dstBlackListSlot2NET;
38-
static std::vector<unsigned int> m_dstWhiteListSlot1NET;
39-
static std::vector<unsigned int> m_dstWhiteListSlot2NET;
40-
41-
static std::vector<unsigned int> m_srcIdBlacklist;
29+
static std::vector<unsigned int> m_blackList;
30+
static std::vector<unsigned int> m_whiteList;
4231

4332
static std::vector<unsigned int> m_prefixes;
4433

4534
static bool m_selfOnly;
4635
static unsigned int m_id;
47-
48-
static bool dstIdBlacklist(unsigned int did, unsigned int slot, bool network);
49-
static bool dstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k, bool network);
5036
};
5137

5238
#endif

0 commit comments

Comments
 (0)