]> gitweb.michael.orlitzky.com - mailshears.git/blobdiff - lib/rm/plugins/postfixadmin_db.rb
Way too many changes to mention. The 'rm' mode works now.
[mailshears.git] / lib / rm / plugins / postfixadmin_db.rb
diff --git a/lib/rm/plugins/postfixadmin_db.rb b/lib/rm/plugins/postfixadmin_db.rb
new file mode 100644 (file)
index 0000000..cd59928
--- /dev/null
@@ -0,0 +1,113 @@
+require 'pg'
+
+require 'common/postfixadmin_db_plugin'
+require 'rm/rm_plugin'
+
+class PostfixadminDbRm
+
+  include PostfixadminDbPlugin
+  include RmPlugin
+
+
+  def delete_account(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)
+    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;'
+
+    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
+
+
+
+  def get_domain_usernames(domain)
+    usernames = []
+
+    # 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 username FROM mailbox WHERE domain = $1;'
+
+      connection.query(sql_query, [domain]) do |result|
+        usernames = result.field_values('username')
+      end
+
+      connection.close()
+    rescue PGError => e
+      # Pretend like we're database-agnostic in case we ever are.
+      raise DatabaseError.new(e)
+    end
+
+    return usernames
+  end
+
+end