require 'common/plugin' require 'common/filesystem' module DovecotPlugin # Code that all Dovecot plugins (Prune, Rm, Mv...) will # share. That is, we implement the Plugin interface. include Plugin def initialize(cfg) @domain_root = cfg.mail_root end def describe_domain(domain) begin domain_path = get_domain_path(domain) return domain_path rescue NonexistentDomainError => e return "Doesn't exist: #{e.to_s}" end end def describe_user(user) begin user_path = get_user_path(user) return user_path rescue NonexistentUserError => e return "Doesn't exist: #{e.to_s}" end end protected; def get_domain_path(domain) # Return the filesystem path for the given domain. # That is, the directory where its mail is stored. # Only works if the domain directory exists! domain_path = File.join(@domain_root, domain) if File.directory?(domain_path) return domain_path else raise NonexistentDomainError.new(domain) end end def get_user_path(user) # Return the filesystem path of this user's mailbox. # Only works if the user exists! if not user.include?('@') msg = "#{user}: Users must contain an '@' symbol." raise InvalidUserError.new(msg) end user_parts = user.split('@') local_part = user_parts[0] domain_part = user_parts[1] begin domain_path = get_domain_path(domain_part) rescue NonexistentDomainError raise NonexistentUserError.new(user) end user_path = File.join(domain_path, local_part) if File.directory?(user_path) return user_path else raise NonexistentUserError.new(user) end end def list_domains() return Filesystem.get_subdirs(@domain_root) end def list_domains_users(domains) users = [] domains.each do |domain| begin # Throws a NonexistentDomainError if the domain's path # doesn't exist on the filesystem. In this case, we want # to report zero users. domain_path = get_domain_path(domain) usernames = Filesystem.get_subdirs(domain_path) usernames.each do |username| users << "#{username}@#{domain}" end rescue NonexistentDomainError # Party hard. end end return users end def list_users() domains = list_domains() users = list_domains_users(domains) return users end end