From 95418256aafd4166ff4791f4aa3f25a8c3b6e556 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Mon, 18 Mar 2013 19:44:57 -0400 Subject: [PATCH] Add another totally-untested plugin: davical. --- lib/mailshears/plugins/davical.rb | 144 ++++++++++++++++++++++++++++++ mailshears.example.conf.yml | 10 ++- 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 lib/mailshears/plugins/davical.rb diff --git a/lib/mailshears/plugins/davical.rb b/lib/mailshears/plugins/davical.rb new file mode 100644 index 0000000..8f6be66 --- /dev/null +++ b/lib/mailshears/plugins/davical.rb @@ -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 diff --git a/mailshears.example.conf.yml b/mailshears.example.conf.yml index 3701cb5..2ab0fdc 100644 --- a/mailshears.example.conf.yml +++ b/mailshears.example.conf.yml @@ -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 -- 2.44.2