|
@@ -36,7 +36,7 @@ DBMirrorSet::DBMirrorSet(DB::ChangeListener *listener) :
|
|
|
}
|
|
|
|
|
|
for(auto db=dbs.begin();db!=dbs.end();++db) {
|
|
|
- (*db)->each([this,&dbs,&db](uint64_t networkId,const nlohmann::json &network,uint64_t memberId,const nlohmann::json &member) {
|
|
|
+ (*db)->each([&dbs,&db](uint64_t networkId,const nlohmann::json &network,uint64_t memberId,const nlohmann::json &member) {
|
|
|
try {
|
|
|
if (network.is_object()) {
|
|
|
if (memberId == 0) {
|
|
@@ -240,4 +240,52 @@ void DBMirrorSet::onNetworkMemberDeauthorize(const void *db,uint64_t networkId,u
|
|
|
_listener->onNetworkMemberDeauthorize(this,networkId,memberId);
|
|
|
}
|
|
|
|
|
|
+std::vector<std::pair<uint64_t, uint64_t>> DBMirrorSet::membersExpiringSoon()
|
|
|
+{
|
|
|
+ std::vector<std::pair<uint64_t, uint64_t>> soon;
|
|
|
+ std::unique_lock<std::mutex> l(_membersExpiringSoon_l);
|
|
|
+ int64_t now = OSUtils::now();
|
|
|
+ for(auto next=_membersExpiringSoon.begin();next!=_membersExpiringSoon.end();) {
|
|
|
+ if (next->first <= now) {
|
|
|
+ // Already expired, so the node will need to re-auth.
|
|
|
+ _membersExpiringSoon.erase(next++);
|
|
|
+ } else {
|
|
|
+ const uint64_t nwid = next->second.first;
|
|
|
+ const uint64_t memberId = next->second.second;
|
|
|
+ nlohmann::json network, member;
|
|
|
+ if (this->get(nwid, network, memberId, member)) {
|
|
|
+ try {
|
|
|
+ const bool authorized = member["authorized"];
|
|
|
+ const bool ssoExempt = member["ssoExempt"];
|
|
|
+ const int64_t authenticationExpiryTime = member["authenticationExpiryTime"];
|
|
|
+ if ((authenticationExpiryTime == next->first)&&(authorized)&&(!ssoExempt)) {
|
|
|
+ if ((authenticationExpiryTime - now) > 10000) {
|
|
|
+ // Stop when we get to entries more than 10s in the future.
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ soon.push_back(std::pair<uint64_t, uint64_t>(nwid, memberId));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // Obsolete entry, no longer authorized, or SSO exempt.
|
|
|
+ _membersExpiringSoon.erase(next++);
|
|
|
+ }
|
|
|
+ } catch ( ... ) {
|
|
|
+ // Invalid member object, erase.
|
|
|
+ _membersExpiringSoon.erase(next++);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // Not found, so erase.
|
|
|
+ _membersExpiringSoon.erase(next++);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return soon;
|
|
|
+}
|
|
|
+
|
|
|
+void DBMirrorSet::memberExpiring(int64_t expTime, uint64_t nwid, uint64_t memberId)
|
|
|
+{
|
|
|
+ std::unique_lock<std::mutex> l(_membersExpiringSoon_l);
|
|
|
+ _membersExpiringSoon.insert(std::pair< int64_t, std::pair< uint64_t, uint64_t > >(expTime, std::pair< uint64_t, uint64_t >(nwid, memberId)));
|
|
|
+}
|
|
|
+
|
|
|
} // namespace ZeroTier
|