X-Git-Url: http://gitweb.michael.orlitzky.com/?p=mailshears.git;a=blobdiff_plain;f=src%2Fdovecot_mailstore.rb;h=d675efc9be45b883c02fdcb15233fea57d71e270;hp=187b6b0dbfad083f5533b86916c099997d29a948;hb=0a35436490fe90a205000f4413523284724f5832;hpb=da71911046617ccffbb899b57162c5e6bdbb37ee diff --git a/src/dovecot_mailstore.rb b/src/dovecot_mailstore.rb index 187b6b0..d675efc 100644 --- a/src/dovecot_mailstore.rb +++ b/src/dovecot_mailstore.rb @@ -1,23 +1,70 @@ +require 'src/errors' require 'src/filesystem' require 'src/mailstore' class DovecotMailstore < Mailstore - def get_accounts_from_filesystem() + def get_domains_from_filesystem() + return Filesystem.get_subdirs(@domain_root) + end + + + def get_accounts_from_filesystem(domains) accounts = [] - - domains = Filesystem.get_subdirs(@domain_root) - + domains.each do |domain| - domain_path = File.join(@domain_root, domain) - usernames = Filesystem.get_subdirs(domain_path) - - usernames.each do |username| - accounts << "#{username}@#{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.new(domain_path) + 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] + + domain_path = get_domain_path(domain_part) + account_path = File.join(domain_path, user_part) + + if File.directory?(account_path) + return account_path + else + raise NonexistentAccountError.new(account_path) + end + end + end