--- /dev/null
+require 'common/plugin'
+require 'pg'
+
+module PostfixadminPlugin
+ # Code that all Postfixadmin plugins (Prune, Rm, Mv...) will
+ # share. That is, we implement the Plugin interface.
+ include Plugin
+
+ def initialize()
+
+ cfg = Configuration.new()
+ @db_host = cfg.postfixadmin_dbhost
+ @db_port = cfg.postfixadmin_dbport
+ @db_opts = cfg.postfixadmin_dbopts
+ @db_tty = cfg.postfixadmin_dbtty
+ @db_name = cfg.postfixadmin_dbname
+ @db_user = cfg.postfixadmin_dbuser
+ @db_pass = cfg.postfixadmin_dbpass
+ end
+
+
+ def describe_account(account)
+ # There's no other unique identifier in PostfixAdmin
+ return account
+ end
+
+
+ def describe_domain(domain)
+ # There's no other unique identifier in PostfixAdmin
+ return domain
+ end
+
+
+ def list_domains()
+ domains = []
+
+ # Just assume PostgreSQL for now.
+ begin
+ connection = PGconn.connect(@db_host,
+ @db_port,
+ @db_opts,
+ @db_tty,
+ @db_name,
+ @db_user,
+ @db_pass)
+
+ # 'ALL' is a magic domain, and we don't want it.
+ sql_query = "SELECT domain FROM domain WHERE domain <> 'ALL';"
+ connection.query(sql_query) do |result|
+ domains = result.field_values('domain')
+ end
+ connection.close()
+ rescue PGError => e
+ # But pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+
+ return domains
+ end
+
+
+ def list_users()
+ accounts = []
+
+ # Just assume PostgreSQL for now.
+ begin
+ connection = PGconn.connect(@db_host,
+ @db_port,
+ @db_opts,
+ @db_tty,
+ @db_name,
+ @db_user,
+ @db_pass)
+
+ # If address = goto, then the alias basically says, "really
+ # deliver to that address; it's not an alias."
+ sql_query = 'SELECT username FROM mailbox;'
+ connection.query(sql_query) do |result|
+ accounts = result.field_values('username')
+ end
+ connection.close()
+ rescue PGError => e
+ # But pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+
+ return accounts
+ end
+
+
+ def list_domains_users(domains)
+ usernames = []
+
+ # Just assume PostgreSQL for now.
+ begin
+ connection = PGconn.connect(@db_host,
+ @db_port,
+ @db_opts,
+ @db_tty,
+ @db_name,
+ @db_user,
+ @db_pass)
+
+ sql_query = 'SELECT username FROM mailbox WHERE domain IN $1;'
+
+ connection.query(sql_query, [domains]) do |result|
+ usernames = result.field_values('username')
+ end
+
+ connection.close()
+ rescue PGError => e
+ # Pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+
+ return usernames
+ end
+
+end