# Needed for rm_rf. require 'fileutils' require 'common/filesystem' require 'common/mailstore' require 'common/plugin' require 'mv/mv_plugin' class DovecotMailstoreMv < Mailstore include Plugin include MvPlugin def initialize cfg = Configuration.new() @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_account(account) begin account_path = get_account_path(account) return account_path rescue NonexistentAccountError => e return "Doesn't exist: #{e.to_s}" end end def mv_domain(from, to) from_path = self.get_domain_path(from) to_path = self.get_domain_path(to) FileUtils.mv(from_path, to_path) end def mv_account(from, to) from_path = self.get_account_path(from) to_path = self.get_account_path(to) FileUtils.mv(from_path, to_path) 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_account_path(account) # Return the filesystem path of this account's mailbox. # Only works if the account exists! if not account.include?('@') msg = "#{account}: Accounts must contain an '@' symbol." raise InvalidAccountError.new(msg) end account_parts = account.split('@') user_part = account_parts[0] domain_part = account_parts[1] begin domain_path = get_domain_path(domain_part) rescue NonexistentDomainError raise NonexistentAccountError.new(account) end account_path = File.join(domain_path, user_part) if File.directory?(account_path) return account_path else raise NonexistentAccountError(account) end end end