class PostfixadminMv

Handle moving (renaming) of users in the Postfixadmin database.

Public Instance Methods

mv_user(src, dst) click to toggle source

Move the user src to dst within the Postfixadmin database. This should “rename” him in every table where he is referenced. Unfortunately that must be done manually.

This can fail is src does not exist, or if dst already exists before the move. It will also fail if the domain associated with the user dst does not exist.

@param src [User] the source user to be moved.

@param dst [User] the destination user being moved to.

# File lib/mv/plugins/postfixadmin.rb, line 27
def mv_user(src, dst)
  raise NonexistentUserError.new(src.to_s()) if not user_exists(src)

  if not domain_exists(dst.domain())
    raise NonexistentDomainError.new(dst.domain.to_s())
  end

  raise UserAlreadyExistsError.new(dst.to_s()) if user_exists(dst)

  mailbox_query  = 'UPDATE mailbox SET '
  mailbox_query += '  username=$1,'
  mailbox_query += '  domain=$2,'
  mailbox_query += "  maildir=CONCAT($2, '/', $3, '/'),"
  mailbox_query += '  local_part=$3 '
  mailbox_query += 'WHERE username=$4;'

  alias_query1  = 'UPDATE alias SET '
  alias_query1 += '  address=$1,'
  alias_query1 += '  domain=$2,'
  alias_query1 += '  goto=REPLACE(goto, $4, $1) '
  alias_query1 += 'WHERE address=$4;'

  alias_query2  = 'UPDATE alias SET '
  alias_query2 += 'goto=REPLACE(goto, $4, $1);'

  sql_queries = [mailbox_query, alias_query1, alias_query2]

  connection = PG::Connection.new(@db_hash)
  begin
    sql_queries.each do |sql_query|
      varchar = 1043 # from pg_type.h
      params = [{:value => dst.to_s(), :type => varchar},
                {:value => dst.domainpart(), :type => varchar},
                {:value => dst.localpart(), :type => varchar},
                {:value => src.to_s(), :type => varchar}]
      connection.sync_exec_params(sql_query, params)
    end
  ensure
    # Make sure the connection gets closed even if a query explodes.
    connection.close()
  end
end