require 'pg' require 'common/postfixadmin_plugin' require 'rm/rm_plugin' class PostfixadminRm include PostfixadminPlugin include RmPlugin def delete_user(user) raise NonexistentUserError.new(user) if not user_exists(user) sql_queries = ['DELETE FROM alias WHERE address = $1;'] # Wipe out any aliases pointed at our user. 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, [user]) 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