require 'pg' require 'common/postfixadmin_plugin' require 'rm/rm_plugin' class PostfixadminRm include PostfixadminPlugin include RmPlugin def delete_user(user) raise NonexistentUserError.new(user.to_s()) 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;' 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.to_s()]) 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() end def delete_domain(domain) raise NonexistentDomainError.new(domain.to_s()) 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;' 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.to_s()]) end connection.close() end protected; def domain_exists(domain) count = 0 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.to_s()]) 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() return (count > 0) end end