| #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_ |