Add another totally-untested plugin: davical.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 18 Mar 2013 23:44:57 +0000 (19:44 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 18 Mar 2013 23:44:57 +0000 (19:44 -0400)
lib/mailshears/plugins/davical.rb [new file with mode: 0644]
mailshears.example.conf.yml

diff --git a/lib/mailshears/plugins/davical.rb b/lib/mailshears/plugins/davical.rb
new file mode 100644 (file)
index 0000000..8f6be66
--- /dev/null
@@ -0,0 +1,144 @@
+require 'pg'
+
+class DavicalDb
+
+  include Plugin
+
+  def initialize()
+    cfg = Configuration.new()
+    @db_host = cfg.davical_dbhost
+    @db_port = cfg.davical_dbport
+    @db_opts = cfg.davical_dbopts
+    @db_tty  = cfg.davical_dbtty
+    @db_name = cfg.davical_dbname
+    @db_user = cfg.davical_dbuser
+    @db_pass = cfg.davical_dbpass
+  end
+
+
+  def describe_domain(domain)
+    # DAViCal doesn't have a concept of domains.
+    return 'N/A'
+  end
+
+
+  def describe_account(account)
+    user_id = self.get_principal_id(account)
+
+    if user_id.nil?
+      return 'User not found'
+    else
+      return "Principal ID: #{user_id}"
+    end
+  end
+
+
+  def delete_domain(domain)
+    # DAViCal doesn't have a concept of domains.
+  end
+
+
+  def delete_account(account)
+    # Delete the given username. DAViCal uses foreign keys properly
+    # and only supports postgres, so we let the ON DELETE CASCADE
+    # trigger handle most of the work.
+    sql_queries = ['DELETE FROM usr WHERE username = $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
+
+      connection.close()
+
+    rescue PGError => e
+      # Pretend like we're database-agnostic in case we ever are.
+      raise DatabaseError.new(e)
+    end
+
+  end
+
+
+  def get_leftover_domains(db_domains)
+    # AgenDAV doesn't have a concept of domains.
+    return []
+  end
+
+
+  def get_leftover_accounts(db_accounts)
+    # Get a list of all users who have logged in to DAViCal.
+    davical_accounts = self.get_davical_usernames()
+    return davical_accounts - db_accounts
+  end
+
+
+  protected;
+
+  def get_principal_id(account)
+    principal_id = nil
+
+    begin
+      connection = PGconn.connect(@db_host,
+                                  @db_port,
+                                  @db_opts,
+                                  @db_tty,
+                                  @db_name,
+                                  @db_user,
+                                  @db_pass)
+
+      sql_query = "SELECT principal_id FROM users WHERE username = $1;"
+
+      connection.query(sql_query, [account]) do |result|
+        if result.num_tuples > 0
+          principal_id = result[0]['principal_id']
+        end
+      end
+
+      connection.close()
+
+    rescue PGError => e
+      # Pretend like we're database-agnostic in case we ever are.
+      raise DatabaseError.new(e)
+    end
+
+    return principal_id
+  end
+
+
+  def get_davical_usernames()
+    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 usr;'
+
+      connection.query(sql_query) 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
index 3701cb523199c4b67b8a320e4fb6c0f615023096..2ab0fdc97ab681a1c642c811bef5a015c7ec5657 100644 (file)
@@ -8,7 +8,7 @@ dbuser: postgres
 dbpass:
 dbname: postfix
 
-plugins: [dovecot_mailstore, roundcube_db, agendav]
+plugins: [dovecot_mailstore, roundcube_db, agendav, davical]
 
 mail_root: /var/spool/mail/vhosts
 
@@ -27,3 +27,11 @@ agendav_dbtty:
 agendav_dbuser: postgres
 agendav_dbpass:
 agendav_dbname: agendav
+
+davical_dbhost: localhost
+davical_dbport: 5432
+davical_dbopts:
+davical_dbtty:
+davical_dbuser: postgres
+davical_dbpass:
+davical_dbname: davical