From 2a3d840b1ee887d9f1da7802f76e759168380f75 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 7 Nov 2014 10:48:37 -0500 Subject: [PATCH] benefits: Add uniqueness validation for email aliases. * CRM/Memberdashboard/BAO/EmailAlias.php (CRM_Memberdashboard_BAO_EmailAlias) [findByLocalpart]: New method. * CRM/Memberdashboard/Page/Benefits.php (CRM_Memberdashboard_Page_Benefits) [add, edit]: Check local part of alias for uniqueness. --- CRM/Memberdashboard/BAO/EmailAlias.php | 24 +++++++++++++++ CRM/Memberdashboard/Page/Benefits.php | 42 ++++++++++++++++---------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/CRM/Memberdashboard/BAO/EmailAlias.php b/CRM/Memberdashboard/BAO/EmailAlias.php index c782c56..0aa3f57 100644 --- a/CRM/Memberdashboard/BAO/EmailAlias.php +++ b/CRM/Memberdashboard/BAO/EmailAlias.php @@ -69,6 +69,30 @@ class CRM_Memberdashboard_BAO_EmailAlias { return $aliases; } + static function findByLocalpart($localpart) { + $dao = CRM_Core_DAO::executeQuery( + 'SELECT * FROM member_email_alias WHERE localpart=%1', + array( 1 => array($localpart, 'String') ) + ); + + if($dao->fetch()) { + $alias = new CRM_Memberdashboard_BAO_EmailAlias( + array( + 'id' => $dao->id, + 'contact_id' => $dao->contact_id, + 'localpart' => $dao->localpart, + 'forward' => $dao->forward + ) + ); + } else { + $alias = NULL; + } + + $dao->free(); + + return $alias; + } + static function countForContact($contactId) { $dao = CRM_Core_DAO::executeQuery( 'SELECT COUNT(*) AS count FROM member_email_alias WHERE contact_id=%1', diff --git a/CRM/Memberdashboard/Page/Benefits.php b/CRM/Memberdashboard/Page/Benefits.php index 7d968f8..41a7da1 100644 --- a/CRM/Memberdashboard/Page/Benefits.php +++ b/CRM/Memberdashboard/Page/Benefits.php @@ -70,22 +70,27 @@ class CRM_Memberdashboard_Page_Benefits extends CRM_Memberdashboard_Page { if(CRM_Utils_Rule::email($forward)) { if(CRM_Utils_Rule::email("$localpart@example.com")) { - if($count < MEMBERDASHBOARD_MAX_EMAIL_ALIASES) { - try { - $params = array( - 'contact_id' => $contactId, - 'localpart' => $localpart, - 'forward' => $forward - ); - CRM_Memberdashboard_BAO_EmailAlias::create($params); - CRM_Core_Session::setStatus('Email alias added!', - 'Success', 'success'); - } catch (Exception $e) { - CRM_Core_Session::setStatus('Failed to create email alias', + if(CRM_Memberdashboard_BAO_EmailAlias::findByLocalpart($localpart) == NULL) { + if($count < MEMBERDASHBOARD_MAX_EMAIL_ALIASES) { + try { + $params = array( + 'contact_id' => $contactId, + 'localpart' => $localpart, + 'forward' => $forward + ); + CRM_Memberdashboard_BAO_EmailAlias::create($params); + CRM_Core_Session::setStatus('Email alias added!', + 'Success', 'success'); + } catch (Exception $e) { + CRM_Core_Session::setStatus('Failed to create email alias', + 'Error', 'error'); + } + } else { + CRM_Core_Session::setStatus('You cannot have more than 5 email aliases', 'Error', 'error'); } } else { - CRM_Core_Session::setStatus('You cannot have more than 5 email aliases', + CRM_Core_Session::setStatus("Local part is already in use: $localpart", 'Error', 'error'); } } else { @@ -121,9 +126,14 @@ class CRM_Memberdashboard_Page_Benefits extends CRM_Memberdashboard_Page { $error .= '
  • You cannot alter email aliases that don\'t belong to you!
  • '; } else if(CRM_Utils_Rule::email($forward)) { if(CRM_Utils_Rule::email("$localpart@example.com")) { - $alias->localpart = $localpart; - $alias->forward = $forward; - $alias->save(); + $existingAlias = CRM_Memberdashboard_BAO_EmailAlias::findByLocalpart($localpart); + if($existingAlias == NULL || $existingAlias->id == $id) { + $alias->localpart = $localpart; + $alias->forward = $forward; + $alias->save(); + } else { + $error .= "
  • Local part already in use: $localpart
  • "; + } } else { $error .= "
  • Invalid local part: $localpart
  • "; } -- 2.25.1