X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=lib%2Fmailshears%2Fplugins%2Fdovecot_mailstore.rb;fp=lib%2Fmailshears%2Fplugins%2Fdovecot_mailstore.rb;h=c50b1173050fc81ac100ae4954eafe578fa08e21;hp=0000000000000000000000000000000000000000;hb=314f5670531dfda9b3d708fce8b0161a098cf134;hpb=fd60e4e45d24c7efe5bc2710ae23f60bbb6b7be1 diff --git a/lib/mailshears/plugins/dovecot_mailstore.rb b/lib/mailshears/plugins/dovecot_mailstore.rb new file mode 100644 index 0000000..c50b117 --- /dev/null +++ b/lib/mailshears/plugins/dovecot_mailstore.rb @@ -0,0 +1,131 @@ +# 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