+require 'common/plugin'
+
+module DovecotMailstorePlugin
+ # Code that all DovecotMailstore plugins (Prune, Rm, Mv...) will
+ # share. That is, we implement the Plugin interface.
+ include Plugin
+
+ def initialize
+ cfg = Configuration.new()
+ @domain_root = cfg.mail_root
+ end
+
+ def describe_domain(domain)
+ begin
+ domain_path = get_domain_path(domain)
+ return domain_path
+ rescue NonexistentDomainError => e
+ return "Doesn't exist: #{e.to_s}"
+ end
+ end
+
+ def describe_account(account)
+ begin
+ account_path = get_account_path(account)
+ return account_path
+ rescue NonexistentAccountError => e
+ return "Doesn't exist: #{e.to_s}"
+ end
+ end
+
+
+ protected;
+
+ 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)
+ 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.new(account)
+ end
+
+ account_path = File.join(domain_path, user_part)
+
+ if File.directory?(account_path)
+ return account_path
+ else
+ raise NonexistentAccountError(account)
+ end
+ end
+
+end