+// Checks if an email update is required in MLs and aliases.
+// This occurs when the user don't have email permissions and her email has changed.
+function require_email_update(User $user, $new_email)
+{
+ Platal::assert(!is_null($user), 'User cannot be null.');
+
+ $is_new = !$user->checkPerms(User::PERM_MAIL) && $new_email != strtolower($user->email);
+ if ($new_email && $is_new) {
+ $already = XDB::fetchOneCell('SELECT hruid
+ FROM accounts
+ WHERE email = {?} AND uid != {?}',
+ $new_email, $user->id());
+ if ($already) {
+ Platal::page()->trigError("L'email ne peut pas être utilisé pour ce compte car il correspond déjà au compte : "
+ . $already . ". Si l'utilisateur courant et cette personne ne sont en fait qu'une "
+ . "seul et même personne, ou en cas de problème, contacter : contact@polytechnique.org");
+ return false;
+ }
+ }
+ return $is_new;
+}
+
+function format_email_alias($email)
+{
+ if ($user = User::getSilent($email)) {
+ return $user->forlifeEmail();
+ }
+ if (isvalid_email($email)) {
+ return $email;
+ }
+ return null;
+}
+
+function add_to_list_alias($email, $local_part, $domain, $type = 'alias')
+{
+ $email = format_email_alias($email);
+ if (is_null($email)) {
+ return false;
+ }
+
+ XDB::execute('INSERT IGNORE INTO email_virtual (email, domain, redirect, type)
+ SELECT {?}, id, {?}, {?}
+ FROM email_virtual_domains
+ WHERE name = {?}',
+ $local_part, $email, $type, $domain);
+ return true;
+}
+
+function delete_from_list_alias($email, $local_part, $domain, $type = 'alias')
+{
+ $email = format_email_alias($email);
+ if (is_null($email)) {
+ return false;
+ }
+
+ XDB::execute('DELETE v
+ FROM email_virtual AS v
+ INNER JOIN email_virtual_domains AS m ON (v.domain = m.id)
+ INNER JOIN email_virtual_domains AS d ON (d.aliasing = m.id)
+ WHERE v.email = {?} AND d.name = {?} AND v.redirect = {?} AND type = {?}',
+ $local_part, $domain, $email, $type);
+ return true;
+}
+
+function update_list_alias($email, $former_email, $local_part, $domain, $type = 'alias')
+{
+ $email = format_email_alias($email);
+ if (is_null($email)) {
+ return false;
+ }
+
+ XDB::execute('UPDATE email_virtual AS v
+ INNER JOIN email_virtual_domains AS d ON (v.domain = d.id)
+ SET v.redirect = {?}
+ WHERE v.redirect = {?} AND d.name = {?} AND v.email = {?} AND v.type = {?}',
+ $email, $former_email, $domain, $local_part, $type);
+ return true;
+}