--- /dev/null
+require 'pg'
+
+require 'common/postfixadmin_plugin'
+require 'rm/rm_plugin'
+
+class PostfixadminRm
+
+ include PostfixadminPlugin
+ include RmPlugin
+
+
+ def delete_account(account)
+ raise NonexistentAccountError.new(account) if not user_exists(account)
+
+ sql_queries = ['DELETE FROM alias WHERE address = $1;']
+ # Wipe out any aliases pointed at our account.
+ sql_queries << "UPDATE alias SET goto=REPLACE(goto, $1, '');"
+ sql_queries << 'DELETE FROM mailbox WHERE username = $1;'
+ sql_queries << 'DELETE FROM quota WHERE username = $1;'
+ sql_queries << 'DELETE FROM quota2 WHERE username = $1;'
+ sql_queries << 'DELETE FROM vacation WHERE email = $1;'
+
+ # Should be handled by a trigger, according to PostfixAdmin code.
+ sql_queries << 'DELETE FROM vacation_notification WHERE on_vacation = $1;'
+
+ begin
+ connection = PGconn.connect(@db_host,
+ @db_port,
+ @db_opts,
+ @db_tty,
+ @db_name,
+ @db_user,
+ @db_pass)
+
+ sql_queries.each do |sql_query|
+ connection.query(sql_query, [account])
+ end
+
+ # The earlier alias update query will leave things like
+ # "foo@example.com,,bar@example.com" in the "goto" column. Now
+ # we fix it. We don't do it in the loop because query() craps
+ # out on the superfluous parameter.
+ sql_query = "UPDATE alias SET goto=REPLACE(goto, ',,', ',');"
+ connection.query(sql_query)
+
+ connection.close()
+
+ rescue PGError => e
+ # Pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+ end
+
+
+ def delete_domain(domain)
+ raise NonexistentDomainError.new(domain) if not domain_exists(domain)
+
+ sql_queries = ['DELETE FROM domain_admins WHERE domain = $1;']
+ sql_queries << 'DELETE FROM alias WHERE domain = $1;'
+ sql_queries << 'DELETE FROM mailbox WHERE domain = $1;'
+ sql_queries << 'DELETE FROM alias_domain WHERE alias_domain = $1;'
+ sql_queries << 'DELETE FROM log WHERE domain = $1;'
+ sql_queries << 'DELETE FROM vacation WHERE domain = $1;'
+ sql_queries << 'DELETE FROM domain WHERE domain = $1;'
+
+ begin
+ connection = PGconn.connect(@db_host,
+ @db_port,
+ @db_opts,
+ @db_tty,
+ @db_name,
+ @db_user,
+ @db_pass)
+
+ sql_queries.each do |sql_query|
+ connection.query(sql_query, [domain])
+ end
+
+ connection.close()
+
+ rescue PGError => e
+ # Pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+
+ end
+
+
+ protected;
+
+ def domain_exists(domain)
+ count = 0
+
+ # 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 COUNT(domain) as count FROM domain WHERE domain = $1;'
+ connection.query(sql_query, [domain]) do |result|
+ return false if result.ntuples() < 1
+ begin
+ count = result.getvalue(0,0).to_i()
+ return false if count.nil?
+ rescue StandardError
+ return false
+ end
+ end
+ connection.close()
+ rescue PGError => e
+ # But pretend like we're database-agnostic in case we ever are.
+ raise DatabaseError.new(e)
+ end
+
+ return (count > 0)
+ end
+
+end