]>
gitweb.michael.orlitzky.com - mailshears.git/blob - plugins/agendav.rb
3 require 'common/agendav_plugin'
7 # Handle moving (renaming) Agendav users in its database. Agendav has
8 # no concept of domains.
15 # Move the user *src* to *dst* within the Agendav database. This
16 # should "rename" him in _every_ table where he is referenced.
18 # This can fail is *src* does not exist, or if *dst* already exists
19 # before the move. It should also be an error if the destination
20 # domain doesn't exist. But Agendav doesn't know about domains, so
23 # @param src [User] the source user to be moved.
25 # @param dst [User] the destination user being moved to.
28 raise NonexistentUserError
.new(src
.to_s()) if not user_exists(src
)
29 raise UserAlreadyExistsError
.new(dst
.to_s()) if user_exists(dst
)
31 connection
= PG
::Connection.new(@db_hash)
33 # The "prefs" table uses the normal username as a key...
34 sql_query
= 'UPDATE prefs SET username = $1 WHERE username = $2;'
35 connection
.query(sql_query
, [dst
.to_s(), src
.to_s()])
37 # But the "shares" table uses encoded principal URLs. For the
38 # "shares" table, we need to do a find/replace on the username
39 # with its "@" symbol translated to a "%40".
40 encoded_src
= src
.to_s()['@'] = '%40'
41 encoded_dst
= dst
.to_s()['@'] = '%40'
43 # Unlike in the "rm" plugin, we do modify the "calendar" field
44 # here. That's because in the usual legitimate use case, the
45 # calendar URL will change when a user moves. This will ALSO
46 # affect people who name their calendars something like
47 # "user%40example.com", but screw those people.
48 sql_queries
<< 'UPDATE shares SET owner=REPLACE(owner, $2, $1);'
49 sql_queries
<< 'UPDATE shares SET calendar=REPLACE(calendar, $2, $1);'
50 sql_queries
<< 'UPDATE shares SET with=REPLACE(with, $2, $1);'
52 sql_queries
.each
do |sql_query
|
53 connection
.query(sql_query
, [encoded_dst
, encoded_src
])
56 # Make sure the connection gets closed even if a query explodes.