]> gitweb.michael.orlitzky.com - mailshears.git/blobdiff - lib/mv/plugins/dovecot_mailstore.rb
Begin building the framework to rename accounts. A pile of crap right now.
[mailshears.git] / lib / mv / plugins / dovecot_mailstore.rb
diff --git a/lib/mv/plugins/dovecot_mailstore.rb b/lib/mv/plugins/dovecot_mailstore.rb
new file mode 100644 (file)
index 0000000..f082452
--- /dev/null
@@ -0,0 +1,92 @@
+# Needed for rm_rf.
+require 'fileutils'
+
+require 'common/filesystem'
+require 'common/mailstore'
+require 'common/plugin'
+require 'mv/mv_plugin'
+
+class DovecotMailstoreMv < Mailstore
+
+  include Plugin
+  include MvPlugin
+
+  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
+
+  def mv_domain(from, to)
+    from_path = self.get_domain_path(from)
+    to_path = self.get_domain_path(to)
+    FileUtils.mv(from_path, to_path)
+  end
+
+  def mv_account(from, to)
+    from_path = self.get_account_path(from)
+    to_path = self.get_account_path(to)
+    FileUtils.mv(from_path, to_path)
+  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