diff options
Diffstat (limited to 'src/mongo/db/auth/role_name.h')
-rw-r--r-- | src/mongo/db/auth/role_name.h | 248 |
1 files changed, 139 insertions, 109 deletions
diff --git a/src/mongo/db/auth/role_name.h b/src/mongo/db/auth/role_name.h index 05b5d30e80b..30ef4d50412 100644 --- a/src/mongo/db/auth/role_name.h +++ b/src/mongo/db/auth/role_name.h @@ -40,146 +40,176 @@ namespace mongo { +/** + * Representation of a name of a role in a MongoDB system. + * + * Consists of a "role name" part and a "datbase name" part. + */ +class RoleName { +public: + RoleName() : _splitPoint(0) {} + RoleName(StringData role, StringData dbname); + /** - * Representation of a name of a role in a MongoDB system. - * - * Consists of a "role name" part and a "datbase name" part. + * Gets the name of the role excluding the "@dbname" component. */ - class RoleName { - public: - RoleName() : _splitPoint(0) {} - RoleName(StringData role, StringData dbname); + StringData getRole() const { + return StringData(_fullName).substr(0, _splitPoint); + } - /** - * Gets the name of the role excluding the "@dbname" component. - */ - StringData getRole() const { return StringData(_fullName).substr(0, _splitPoint); } + /** + * Gets the database name part of a role name. + */ + StringData getDB() const { + return StringData(_fullName).substr(_splitPoint + 1); + } - /** - * Gets the database name part of a role name. - */ - StringData getDB() const { return StringData(_fullName).substr(_splitPoint + 1); } + bool empty() const { + return _fullName.empty(); + } - bool empty() const { return _fullName.empty(); } + /** + * Gets the full name of a role as a string, formatted as "role@db". + * + * Allowed for keys in non-persistent data structures, such as std::map. + */ + const std::string& getFullName() const { + return _fullName; + } - /** - * Gets the full name of a role as a string, formatted as "role@db". - * - * Allowed for keys in non-persistent data structures, such as std::map. - */ - const std::string& getFullName() const { return _fullName; } + /** + * Stringifies the object, for logging/debugging. + */ + const std::string& toString() const { + return getFullName(); + } - /** - * Stringifies the object, for logging/debugging. - */ - const std::string& toString() const { return getFullName(); } +private: + std::string _fullName; // The full name, stored as a string. "role@db". + size_t _splitPoint; // The index of the "@" separating the role and db name parts. +}; - private: - std::string _fullName; // The full name, stored as a string. "role@db". - size_t _splitPoint; // The index of the "@" separating the role and db name parts. - }; +static inline bool operator==(const RoleName& lhs, const RoleName& rhs) { + return lhs.getFullName() == rhs.getFullName(); +} - static inline bool operator==(const RoleName& lhs, const RoleName& rhs) { - return lhs.getFullName() == rhs.getFullName(); - } +static inline bool operator!=(const RoleName& lhs, const RoleName& rhs) { + return lhs.getFullName() != rhs.getFullName(); +} - static inline bool operator!=(const RoleName& lhs, const RoleName& rhs) { - return lhs.getFullName() != rhs.getFullName(); +static inline bool operator<(const RoleName& lhs, const RoleName& rhs) { + if (lhs.getDB() == rhs.getDB()) { + return lhs.getRole() < rhs.getRole(); } + return lhs.getDB() < rhs.getDB(); +} - static inline bool operator<(const RoleName& lhs, const RoleName& rhs) { - if (lhs.getDB() == rhs.getDB()) { - return lhs.getRole() < rhs.getRole(); - } - return lhs.getDB() < rhs.getDB(); - } +std::ostream& operator<<(std::ostream& os, const RoleName& name); - std::ostream& operator<<(std::ostream& os, const RoleName& name); +/** + * Iterator over an unspecified container of RoleName objects. + */ +class RoleNameIterator { +public: + class Impl { + MONGO_DISALLOW_COPYING(Impl); - /** - * Iterator over an unspecified container of RoleName objects. - */ - class RoleNameIterator { public: - class Impl { - MONGO_DISALLOW_COPYING(Impl); - public: - Impl() {}; - virtual ~Impl() {}; - static Impl* clone(Impl* orig) { return orig ? orig->doClone(): NULL; } - virtual bool more() const = 0; - virtual const RoleName& get() const = 0; - - virtual const RoleName& next() = 0; - - private: - virtual Impl* doClone() const = 0; - }; - - RoleNameIterator() : _impl(nullptr) {} - RoleNameIterator(const RoleNameIterator& other) : _impl(Impl::clone(other._impl.get())) {} - explicit RoleNameIterator(Impl* impl) : _impl(impl) {} - - RoleNameIterator& operator=(const RoleNameIterator& other) { - _impl.reset(Impl::clone(other._impl.get())); - return *this; + Impl(){}; + virtual ~Impl(){}; + static Impl* clone(Impl* orig) { + return orig ? orig->doClone() : NULL; } + virtual bool more() const = 0; + virtual const RoleName& get() const = 0; - bool more() const { return _impl.get() && _impl->more(); } - const RoleName& get() const { return _impl->get(); } - - const RoleName& next() { return _impl->next(); } - - const RoleName& operator*() const { return get(); } - const RoleName* operator->() const { return &get(); } + virtual const RoleName& next() = 0; private: - std::unique_ptr<Impl> _impl; + virtual Impl* doClone() const = 0; }; -} // namespace mongo + RoleNameIterator() : _impl(nullptr) {} + RoleNameIterator(const RoleNameIterator& other) : _impl(Impl::clone(other._impl.get())) {} + explicit RoleNameIterator(Impl* impl) : _impl(impl) {} + + RoleNameIterator& operator=(const RoleNameIterator& other) { + _impl.reset(Impl::clone(other._impl.get())); + return *this; + } + + bool more() const { + return _impl.get() && _impl->more(); + } + const RoleName& get() const { + return _impl->get(); + } + + const RoleName& next() { + return _impl->next(); + } + + const RoleName& operator*() const { + return get(); + } + const RoleName* operator->() const { + return &get(); + } + +private: + std::unique_ptr<Impl> _impl; +}; + +} // namespace mongo // Define hash function for RoleNames so they can be keys in std::unordered_map MONGO_HASH_NAMESPACE_START - template <> struct hash<mongo::RoleName> { - size_t operator()(const mongo::RoleName& rname) const { - return hash<std::string>()(rname.getFullName()); - } - }; +template <> +struct hash<mongo::RoleName> { + size_t operator()(const mongo::RoleName& rname) const { + return hash<std::string>()(rname.getFullName()); + } +}; MONGO_HASH_NAMESPACE_END namespace mongo { - template <typename ContainerIterator> - class RoleNameContainerIteratorImpl : public RoleNameIterator::Impl { - MONGO_DISALLOW_COPYING(RoleNameContainerIteratorImpl); - public: - RoleNameContainerIteratorImpl(const ContainerIterator& begin, - const ContainerIterator& end) : - _curr(begin), _end(end) {} - virtual ~RoleNameContainerIteratorImpl() {} - virtual bool more() const { return _curr != _end; } - virtual const RoleName& next() { return *(_curr++); } - virtual const RoleName& get() const { return *_curr; } - virtual RoleNameIterator::Impl* doClone() const { - return new RoleNameContainerIteratorImpl(_curr, _end); - } +template <typename ContainerIterator> +class RoleNameContainerIteratorImpl : public RoleNameIterator::Impl { + MONGO_DISALLOW_COPYING(RoleNameContainerIteratorImpl); - private: - ContainerIterator _curr; - ContainerIterator _end; - }; - - template <typename ContainerIterator> - RoleNameIterator makeRoleNameIterator(const ContainerIterator& begin, - const ContainerIterator& end) { - return RoleNameIterator( new RoleNameContainerIteratorImpl<ContainerIterator>(begin, end)); +public: + RoleNameContainerIteratorImpl(const ContainerIterator& begin, const ContainerIterator& end) + : _curr(begin), _end(end) {} + virtual ~RoleNameContainerIteratorImpl() {} + virtual bool more() const { + return _curr != _end; } - - template <typename Container> - RoleNameIterator makeRoleNameIteratorForContainer(const Container& container) { - return makeRoleNameIterator(container.begin(), container.end()); + virtual const RoleName& next() { + return *(_curr++); } + virtual const RoleName& get() const { + return *_curr; + } + virtual RoleNameIterator::Impl* doClone() const { + return new RoleNameContainerIteratorImpl(_curr, _end); + } + +private: + ContainerIterator _curr; + ContainerIterator _end; +}; + +template <typename ContainerIterator> +RoleNameIterator makeRoleNameIterator(const ContainerIterator& begin, + const ContainerIterator& end) { + return RoleNameIterator(new RoleNameContainerIteratorImpl<ContainerIterator>(begin, end)); +} + +template <typename Container> +RoleNameIterator makeRoleNameIteratorForContainer(const Container& container) { + return makeRoleNameIterator(container.begin(), container.end()); +} } // namespace mongo |