diff options
Diffstat (limited to 'server/Network.cpp')
-rw-r--r-- | server/Network.cpp | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/server/Network.cpp b/server/Network.cpp index cba9edf5..72a15454 100644 --- a/server/Network.cpp +++ b/server/Network.cpp @@ -70,22 +70,66 @@ std::string Network::toString() const { return repr.str(); } -bool Network::appliesToUser(uid_t uid) const { - return mUidRanges.hasUid(uid); +std::string Network::uidRangesToString() const { + if (mUidRangeMap.empty()) { + return ""; + } + + std::ostringstream result; + for (auto it = mUidRangeMap.begin(); it != mUidRangeMap.end(); ++it) { + result << "prio " << it->first << " " << it->second.toString(); + if (std::next(it) != mUidRangeMap.end()) result << "; "; + } + return result.str(); +} + +// Check if the user has been added to this network. If yes, the highest priority of matching +// setting is returned by subPriority. Thus caller can make choice among several matching +// networks. +bool Network::appliesToUser(uid_t uid, uint32_t* subPriority) const { + for (const auto& [priority, uidRanges] : mUidRangeMap) { + if (uidRanges.hasUid(uid)) { + *subPriority = priority; + return true; + } + } + return false; } -bool Network::hasInvalidUidRanges(const UidRanges& uidRanges) const { +void Network::addToUidRangeMap(const UidRanges& uidRanges, uint32_t subPriority) { + auto iter = mUidRangeMap.find(subPriority); + if (iter != mUidRangeMap.end()) { + iter->second.add(uidRanges); + } else { + mUidRangeMap[subPriority] = uidRanges; + } +} + +void Network::removeFromUidRangeMap(const UidRanges& uidRanges, uint32_t subPriority) { + auto iter = mUidRangeMap.find(subPriority); + if (iter != mUidRangeMap.end()) { + iter->second.remove(uidRanges); + if (iter->second.empty()) { + mUidRangeMap.erase(subPriority); + } + } else { + ALOGW("uidRanges with priority %u not found", subPriority); + } +} + +bool Network::canAddUidRanges(const UidRanges& uidRanges, uint32_t subPriority) const { if (uidRanges.overlapsSelf()) { ALOGE("uid range %s overlaps self", uidRanges.toString().c_str()); - return true; + return false; } - if (uidRanges.overlaps(mUidRanges)) { - ALOGE("uid range %s overlaps %s", uidRanges.toString().c_str(), - mUidRanges.toString().c_str()); - return true; + auto iter = mUidRangeMap.find(subPriority); + if (iter != mUidRangeMap.end() && uidRanges.overlaps(iter->second)) { + ALOGE("uid range %s overlaps priority %u %s", uidRanges.toString().c_str(), subPriority, + iter->second.toString().c_str()); + return false; } - return false; + return true; } bool Network::isSecure() const { |