--- /dev/null
+# Needed for rm_rf.
+require 'fileutils'
+
+require 'mailshears/errors'
+require 'mailshears/filesystem'
+require 'mailshears/mailstore'
+require 'mailshears/plugin'
+
+class DovecotMailstore < Mailstore
+
+ include Plugin
+
+ def initialize
+ @domain_root = Configuration::MAIL_ROOT
+ end
+
+ def describe_domain(domain)
+ begin
+ domain_path = get_domain_path(domain)
+ return domain_path
+ rescue NonexistentDomainError => e
+ return "Doesn't Exist"
+ end
+ end
+
+ def describe_account(account)
+ begin
+ account_path = get_account_path(account)
+ return account_path
+ rescue NonexistentAccountError => e
+ return "Doesn't Exist"
+ end
+ end
+
+ def delete_domain(domain)
+ domain_path = self.get_domain_path(domain)
+ FileUtils.rm_rf(domain_path)
+ end
+
+ def delete_account(account)
+ account_path = self.get_account_path(account)
+ FileUtils.rm_rf(account_path)
+ end
+
+ def get_leftover_domains(db_domains)
+ # Get the list of domains according to the filesystem.
+ fs_domains = self.get_domains_from_filesystem()
+
+ # Return the list of domains on the filesystem that aren't in the DB.
+ return (fs_domains - db_domains)
+ end
+
+ def get_leftover_accounts(db_accounts)
+ # Get the list of accounts according to the filesystem.
+ fs_domains = self.get_domains_from_filesystem()
+ fs_accounts = self.get_accounts_from_filesystem(fs_domains)
+
+ # And return the accounts on the filesystem that aren't in the DB.
+ return (fs_accounts - db_accounts)
+ end
+
+ protected;
+
+ def get_domains_from_filesystem()
+ return Filesystem.get_subdirs(@domain_root)
+ end
+
+ def get_accounts_from_filesystem(domains)
+ accounts = []
+
+ 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 accounts.
+ domain_path = get_domain_path(domain)
+ usernames = Filesystem.get_subdirs(domain_path)
+
+ usernames.each do |username|
+ accounts << "#{username}@#{domain}"
+ end
+ rescue NonexistentDomainError => e
+ # Party hard.
+ end
+ end
+
+ return accounts
+ end
+
+
+ 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
+ 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?('@')
+ raise InvalidAccountError.new("#{account}: Accounts must contain an '@' symbol.")
+ 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
+ end
+
+ account_path = File.join(domain_path, user_part)
+
+ if File.directory?(account_path)
+ return account_path
+ else
+ raise NonexistentAccountError
+ end
+ end
+
+end