|
20 | 20 | #include <vector>
|
21 | 21 | #include <cstring>
|
22 | 22 |
|
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; |
35 | 25 |
|
36 | 26 | std::vector<unsigned int> CDMRAccessControl::m_prefixes;
|
37 | 27 |
|
38 | 28 | bool CDMRAccessControl::m_selfOnly = false;
|
39 | 29 |
|
40 | 30 | unsigned int CDMRAccessControl::m_id = 0U;
|
41 | 31 |
|
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) |
43 | 33 | {
|
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; |
52 | 36 | }
|
53 | 37 |
|
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) |
151 | 39 | {
|
152 | 40 | if (m_selfOnly) {
|
153 | 41 | return id == m_id;
|
154 | 42 | } 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()) |
156 | 44 | return false;
|
157 | 45 |
|
158 | 46 | unsigned int prefix = id / 10000U;
|
159 | 47 | if (prefix == 0U || prefix > 999U)
|
160 | 48 | return false;
|
161 | 49 |
|
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 | + } |
164 | 55 |
|
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(); |
168 | 58 |
|
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 { |
182 | 59 | return true;
|
183 | 60 | }
|
184 | 61 | }
|
0 commit comments