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