|  | #ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_ | 
|  | #define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_ | 
|  |  | 
|  | #include <cstdint> | 
|  | #include <map> | 
|  |  | 
|  | #include "absl/base/thread_annotations.h" | 
|  | #include "absl/status/status.h" | 
|  | #include "absl/synchronization/mutex.h" | 
|  | #include "config_parser.h" | 
|  |  | 
|  | namespace milotic::authz { | 
|  |  | 
|  | class SubscriptionTracker { | 
|  | public: | 
|  | SubscriptionTracker(); | 
|  | explicit SubscriptionTracker(int universal_subscription_limit) | 
|  | : universal_subscription_limit_(universal_subscription_limit) {} | 
|  |  | 
|  | // Records a new subscription for the given `peer`. | 
|  | // Returns error if the client has reached to the subscription limit. | 
|  | absl::Status RecordNewSubscription(const PeerSpiffeIdentity& peer); | 
|  |  | 
|  | // Records the an unsubscription for the given `peer`. | 
|  | absl::Status RecordNewUnsubscription(const PeerSpiffeIdentity& peer); | 
|  |  | 
|  | // Returns the subscription limit for the given `peer`. Currently returns the | 
|  | // universal subscription limit. | 
|  | int64_t GetSubscriptionLimit(const PeerSpiffeIdentity&) { | 
|  | absl::MutexLock lock(&mutex_); | 
|  | return universal_subscription_limit_; | 
|  | } | 
|  |  | 
|  | // Sets the limit for the universal subscription limit. | 
|  | // Will be called when authorization policy is reloaded. | 
|  | void SetUniversalSubscriptionLimit(int64_t limit) { | 
|  | absl::MutexLock lock(&mutex_); | 
|  | universal_subscription_limit_ = limit; | 
|  | } | 
|  |  | 
|  | private: | 
|  | absl::Mutex mutex_; | 
|  | int64_t universal_subscription_limit_ ABSL_GUARDED_BY(mutex_) = 0; | 
|  | std::map<AuthzConfiguration::SpiffeIdentityMatcher, int64_t> | 
|  | peer_to_subscription_count_ ABSL_GUARDED_BY(mutex_); | 
|  | }; | 
|  | }  // namespace milotic::authz | 
|  |  | 
|  | #endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_SUBSCRIPTION_TRACKER_H_ |