From 0a35436490fe90a205000f4413523284724f5832 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Tue, 13 Jul 2010 20:44:08 -0400 Subject: [PATCH] Added error handling to the domain/account path methods. --- src/dovecot_mailstore.rb | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/dovecot_mailstore.rb b/src/dovecot_mailstore.rb index 430c8e4..d675efc 100644 --- a/src/dovecot_mailstore.rb +++ b/src/dovecot_mailstore.rb @@ -1,3 +1,4 @@ +require 'src/errors' require 'src/filesystem' require 'src/mailstore' @@ -12,17 +13,18 @@ class DovecotMailstore < Mailstore accounts = [] domains.each do |domain| - domain_path = get_domain_path(domain) - - if File.directory?(domain_path) - # If domain_path isn't a directory, maybe the - # domain folder doesn't exist? In that case, I - # guess we want to report zero accounts. + 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 @@ -33,19 +35,36 @@ class DovecotMailstore < Mailstore 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) - return domain_path + + 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 -- 2.44.2