]>
gitweb.michael.orlitzky.com - mailshears.git/blob - lib/common/postfixadmin_plugin.rb
1 require 'common/domain'
2 require 'common/plugin'
6 # Code that all Postfixadmin plugins ({PostfixadminPrune},
7 # {PostfixadminRm}, {PostfixadminMv}) share.
9 module PostfixadminPlugin
11 # We implement the Plugin "interface."
14 # Initialize this Postfixadmin {Plugin} with values in *cfg*.
16 # @param cfg [Configuration] the configuration for this plugin.
20 :host => cfg
.postfixadmin_dbhost
,
21 :port => cfg
.postfixadmin_dbport
,
22 :options => cfg
.postfixadmin_dbopts
,
23 :dbname => cfg
.postfixadmin_dbname
,
24 :user => cfg
.postfixadmin_dbuser
,
25 :password => cfg
.postfixadmin_dbpass
}
29 # Obtain a list of domains from Postfixadmin. This is more efficient
30 # than the {Plugin} default implementation because domains have
31 # their own table in the database and we can easily select them
32 # rather than filtering the list of users.
34 # @return [Array<Domain>] a list of the domains in Postfixadmin.
39 connection
= PG
::Connection.new(@db_hash)
41 # 'ALL' is a magic domain, and we don't want it.
42 sql_query
= "SELECT domain FROM domain WHERE domain <> 'ALL';"
45 connection
.sync_exec(sql_query
) do |result
|
46 domains
= result
.field_values('domain')
49 # Make sure the connection gets closed even if the query explodes.
53 return domains
.map
{ |d
| Domain
.new(d
) }
57 # Return a list of Postfixadmin users.
59 # @return [Array<User>] a list of users contained in the
60 # Postfixadmin database.
65 connection
= PG
::Connection.new(@db_hash)
67 sql_query
= 'SELECT username FROM mailbox;'
70 connection
.sync_exec(sql_query
) do |result
|
71 users
= result
.field_values('username')
74 # Make sure the connection gets closed even if the query explodes.
78 return users
.map
{ |u
| User
.new(u
) }
83 # Efficiently list all Postfixadmin users belonging to the given
84 # Postfixadmin *domains*.
86 # @param domains [Array<Domain>] the domains whose users we want.
88 # @return [Array<User>] a list of {User} objects belonging to
89 # *domains* for this plugin.
91 def list_domains_users(domains
)
93 return usernames
if domains
.length() == 0
95 connection
= PG
::Connection.new(@db_hash)
97 # The number of parameters that we'll pass into our prepared query
98 # is the number of domains that we're given. It's important that
99 # we have at least one domain here.
100 params
= 1.upto(domains
.length()).map
{ |i
| '$' + i
.to_s() }.join(',')
101 sql_query
= "SELECT username FROM mailbox WHERE domain IN (#{params});"
104 # Now replace each Domain with its string representation and pass
105 # those in as our individual parameters.
106 connection
.sync_exec_params(sql_query
, domains
.map
{ |d
| d
.to_s() }) do |result
|
107 usernames
= result
.field_values('username')
110 # Make sure the connection gets closed even if the query explodes.
114 return usernames
.map
{ |u
| User
.new(u
) }
118 # Get a list of all Postfixadmin aliases as a <tt>from => to</tt>
119 # hash. This is useful for testing, since aliases should be removed
120 # when either the "from user" or "to user" are removed.
122 # @return [Hash] all aliases known to Postfixadmin in the form of a
123 # <tt>from => to</tt> hash.
128 connection
= PG
::Connection.new(@db_hash)
130 sql_query
= 'SELECT address,goto FROM alias;'
133 results
= connection
.sync_exec(sql_query
)
134 results
.each
do |row
|
135 # row should be a hash
139 # Make sure the connection gets closed even if the query explodes.
147 # A fast implementation of the "does this domain exist?"
148 # operation. It only queries the database for the existence of
149 # *domain* rather than a list of all domains (which is the default
152 # @param domain [Domain] the domain whose existence is in question.
154 # @return [Boolean] true if *domain* exists in the Postfixadmin
155 # database and false otherwise.
157 def domain_exists(domain
)
160 connection
= PG
::Connection.new(@db_hash)
162 sql_query
= 'SELECT COUNT(domain) as count FROM domain WHERE domain = $1;'
165 connection
.sync_exec_params(sql_query
, [domain
.to_s()]) do |result
|
166 return false if result
.ntuples() < 1
167 count
= result
.getvalue(0,0).to_i()
169 return false if count
.nil?
172 # Make sure the connection gets closed even if the query explodes.