]> gitweb.michael.orlitzky.com - mailshears.git/blob - lib/mailshears/plugins/davical.rb
8f6be66959da76d31d6a0e2b26db59ecd613a6f5
[mailshears.git] / lib / mailshears / plugins / davical.rb
1 require 'pg'
2
3 class DavicalDb
4
5 include Plugin
6
7 def initialize()
8 cfg = Configuration.new()
9 @db_host = cfg.davical_dbhost
10 @db_port = cfg.davical_dbport
11 @db_opts = cfg.davical_dbopts
12 @db_tty = cfg.davical_dbtty
13 @db_name = cfg.davical_dbname
14 @db_user = cfg.davical_dbuser
15 @db_pass = cfg.davical_dbpass
16 end
17
18
19 def describe_domain(domain)
20 # DAViCal doesn't have a concept of domains.
21 return 'N/A'
22 end
23
24
25 def describe_account(account)
26 user_id = self.get_principal_id(account)
27
28 if user_id.nil?
29 return 'User not found'
30 else
31 return "Principal ID: #{user_id}"
32 end
33 end
34
35
36 def delete_domain(domain)
37 # DAViCal doesn't have a concept of domains.
38 end
39
40
41 def delete_account(account)
42 # Delete the given username. DAViCal uses foreign keys properly
43 # and only supports postgres, so we let the ON DELETE CASCADE
44 # trigger handle most of the work.
45 sql_queries = ['DELETE FROM usr WHERE username = $1']
46
47 begin
48 connection = PGconn.connect(@db_host,
49 @db_port,
50 @db_opts,
51 @db_tty,
52 @db_name,
53 @db_user,
54 @db_pass)
55
56 sql_queries.each do |sql_query|
57 connection.query(sql_query, [account])
58 end
59
60 connection.close()
61
62 rescue PGError => e
63 # Pretend like we're database-agnostic in case we ever are.
64 raise DatabaseError.new(e)
65 end
66
67 end
68
69
70 def get_leftover_domains(db_domains)
71 # AgenDAV doesn't have a concept of domains.
72 return []
73 end
74
75
76 def get_leftover_accounts(db_accounts)
77 # Get a list of all users who have logged in to DAViCal.
78 davical_accounts = self.get_davical_usernames()
79 return davical_accounts - db_accounts
80 end
81
82
83 protected;
84
85 def get_principal_id(account)
86 principal_id = nil
87
88 begin
89 connection = PGconn.connect(@db_host,
90 @db_port,
91 @db_opts,
92 @db_tty,
93 @db_name,
94 @db_user,
95 @db_pass)
96
97 sql_query = "SELECT principal_id FROM users WHERE username = $1;"
98
99 connection.query(sql_query, [account]) do |result|
100 if result.num_tuples > 0
101 principal_id = result[0]['principal_id']
102 end
103 end
104
105 connection.close()
106
107 rescue PGError => e
108 # Pretend like we're database-agnostic in case we ever are.
109 raise DatabaseError.new(e)
110 end
111
112 return principal_id
113 end
114
115
116 def get_davical_usernames()
117 usernames = []
118
119 # Just assume PostgreSQL for now.
120 begin
121 connection = PGconn.connect(@db_host,
122 @db_port,
123 @db_opts,
124 @db_tty,
125 @db_name,
126 @db_user,
127 @db_pass)
128
129 sql_query = 'SELECT username FROM usr;'
130
131 connection.query(sql_query) do |result|
132 usernames = result.field_values('username')
133 end
134
135 connection.close()
136 rescue PGError => e
137 # Pretend like we're database-agnostic in case we ever are.
138 raise DatabaseError.new(e)
139 end
140
141 return usernames
142 end
143
144 end