Added error handling to the domain/account path methods.
authorMichael Orlitzky <michael@orlitzky.com>
Wed, 14 Jul 2010 00:44:08 +0000 (20:44 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Wed, 14 Jul 2010 00:44:08 +0000 (20:44 -0400)
src/dovecot_mailstore.rb

index 430c8e44bd3ec81863ac6e8e5fb3cf8a74c9edee..d675efc9be45b883c02fdcb15233fea57d71e270 100644 (file)
@@ -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