+ def list_users()
+ # Return a list of all users managed by this plugin.
+ raise NotImplementedError
+ end
+
+ def user_exists(username)
+ # Does the given username exist for this plugin? We use a naive
+ # implementation here based on list_users() which is required to
+ # exist above. Plugins can override this with something fast.
+ users = list_users()
+ return users.include?(username)
+ end
+
+ def list_domains_users(domains)
+ # Get all usernames belonging to the given domains. If a username
+ # ends in @example.com, it belongs to the domain example.com
+ #
+ # This uses a naive loop, but relies only on the existence of a
+ # list_users() method which is guaranteed above. More efficient
+ # implementations can usually be made within the plugin.
+ domains_users = []
+
+ usernames = list_users();
+ domains.each do |d|
+ matches = usernames.select do |username|
+ username =~ /@#{d}$/
+ end
+
+ domains_users += matches
+ end
+
+ return domains_users
+ end
+