diff --git a/.htaccess b/.htaccess
index c6dda8429..4eaa9138a 100644
--- a/.htaccess
+++ b/.htaccess
@@ -2,3 +2,8 @@
IndexIgnore *
Options -Indexes
+
+# Security headers (requires mod_headers; AllowOverride FileInfo or All).
+
- getAccessLevel('pipelines.removeFromPipeline') >= ACCESS_LEVEL_DELETE): ?>
-
-
-
-
+ getAccessLevel('pipelines.removeFromPipeline') >= ACCESS_LEVEL_DELETE): ?>
+
', "\n";
+ echo $openTag,
+ '
',
+ $closeTag,
+ ' ', "\n";
$escapedURL = htmlspecialchars($savedSearchRow['URL']);
@@ -481,9 +497,12 @@ public static function printSavedSearch($savedSearchRS)
}
$escapedURL = '/'.$escapedURL;
- echo '',
- '
';
+ echo ' ';
echo '', "\n";
echo '', "\n";
echo '', "\n";
+ if (isset($_SESSION['CATS']) && $_SESSION['CATS']->isLoggedIn())
+ {
+ $csrfToken = $_SESSION['CATS']->getCSRFToken();
+ echo '', "\n";
+ echo '', "\n";
+ }
$headIncludes[] = 'main.css';
diff --git a/main.css b/main.css
index b806329e8..7af638d50 100755
--- a/main.css
+++ b/main.css
@@ -424,7 +424,8 @@ p.noteUnsized
color: #666666;
}
-p.warning
+p.warning,
+div.warning
{
background-image: url('images/orange_gradient.jpg');
background-repeat: repeat-x;
@@ -776,6 +777,29 @@ p.freeformbottom
border: 1px solid #a4a4a4;
}
+button.linkButton
+{
+ background: none;
+ border: none;
+ padding: 0;
+ margin: 0;
+ cursor: pointer;
+ display: inline;
+ color: #00008b;
+ text-decoration: none;
+ font: normal normal normal 12px/130% Arial, Tahoma, sans-serif;
+}
+
+button.linkButton:hover
+{
+ text-decoration: underline;
+}
+
+button.linkButton.jobLinkHot
+{
+ color: #ff0000;
+}
+
.buttonCalendar
{
height: 20px;
diff --git a/modules/calendar/CalendarUI.js b/modules/calendar/CalendarUI.js
index 5d0755844..765e37a21 100755
--- a/modules/calendar/CalendarUI.js
+++ b/modules/calendar/CalendarUI.js
@@ -424,8 +424,34 @@ function confirmDeleteEntry()
return;
}
- document.location = getCurrentCalendarUrl() + '&a=deleteEvent&eventID='
- + document.getElementById('eventIDEdit').value;
+ var form = document.createElement('form');
+ form.method = 'post';
+ form.action = getCurrentCalendarUrl() + '&a=deleteEvent';
+
+ var postback = document.createElement('input');
+ postback.type = 'hidden';
+ postback.name = 'postback';
+ postback.value = 'postback';
+ form.appendChild(postback);
+
+ var eventID = document.createElement('input');
+ eventID.type = 'hidden';
+ eventID.name = 'eventID';
+ eventID.value = document.getElementById('eventIDEdit').value;
+ form.appendChild(eventID);
+
+ if (typeof CATSCsrfToken != 'undefined' && CATSCsrfToken !== null &&
+ CATSCsrfToken !== '')
+ {
+ var csrfToken = document.createElement('input');
+ csrfToken.type = 'hidden';
+ csrfToken.name = 'csrfToken';
+ csrfToken.value = CATSCsrfToken;
+ form.appendChild(csrfToken);
+ }
+
+ document.body.appendChild(form);
+ form.submit();
}
/* Hides all the main window views (month, week, day, etc). */
diff --git a/modules/calendar/CalendarUI.php b/modules/calendar/CalendarUI.php
index 234a38d00..24fe19448 100755
--- a/modules/calendar/CalendarUI.php
+++ b/modules/calendar/CalendarUI.php
@@ -77,7 +77,14 @@ public function handleRequest()
break;
case 'deleteEvent':
- $this->onDeleteEvent();
+ if ($this->isPostBack())
+ {
+ $this->onDeleteEvent();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
break;
case 'showCalendar':
@@ -692,12 +699,12 @@ private function onDeleteEvent()
}
/* Bail out if we don't have a valid event ID. */
- if (!$this->isRequiredIDValid('eventID', $_GET))
+ if (!$this->isRequiredIDValid('eventID', $_POST))
{
CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid event ID.');
}
- $eventID = $_GET['eventID'];
+ $eventID = $_POST['eventID'];
if (!eval(Hooks::get('CALENDAR_DELETE_PRE'))) return;
diff --git a/modules/candidates/CandidatesUI.php b/modules/candidates/CandidatesUI.php
index 7b7d13aef..971045048 100755
--- a/modules/candidates/CandidatesUI.php
+++ b/modules/candidates/CandidatesUI.php
@@ -125,13 +125,20 @@ public function handleRequest()
break;
- case 'delete':
- if ($this->getUserAccessLevel('candidates.delete') < ACCESS_LEVEL_DELETE)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->onDelete();
- break;
+ case 'delete':
+ if ($this->getUserAccessLevel('candidates.delete') < ACCESS_LEVEL_DELETE)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->onDelete();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
case 'search':
if ($this->getUserAccessLevel('candidates.search') < ACCESS_LEVEL_READ)
@@ -180,13 +187,20 @@ public function handleRequest()
* Add candidate to pipeline after selecting a job order for which
* to consider a candidate (in the modal window).
*/
- case 'addToPipeline':
- if ($this->getUserAccessLevel('pipelines.addToPipeline') < ACCESS_LEVEL_EDIT)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->onAddToPipeline();
- break;
+ case 'addToPipeline':
+ if ($this->getUserAccessLevel('pipelines.addToPipeline') < ACCESS_LEVEL_EDIT)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->onAddToPipeline();
+ }
+ else
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
case 'addCandidateTags':
if ($this->getUserAccessLevel('candidates.addCandidateTags') < ACCESS_LEVEL_EDIT )
@@ -221,13 +235,20 @@ public function handleRequest()
break;
/* Remove a candidate from a pipeline. */
- case 'removeFromPipeline':
- if ($this->getUserAccessLevel('pipelines.removeFromPipeline') < ACCESS_LEVEL_DELETE)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->onRemoveFromPipeline();
- break;
+ case 'removeFromPipeline':
+ if ($this->getUserAccessLevel('pipelines.removeFromPipeline') < ACCESS_LEVEL_DELETE)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->onRemoveFromPipeline();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
case 'addEditImage':
if ($this->getUserAccessLevel('candidates.addEditImage') < ACCESS_LEVEL_EDIT)
@@ -266,22 +287,36 @@ public function handleRequest()
break;
/* Administrators can hide a candidate from a site with this action. */
- case 'administrativeHideShow':
- if ($this->getUserAccessLevel('candidates.hidden') < ACCESS_LEVEL_MULTI_SA)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->administrativeHideShow();
- break;
+ case 'administrativeHideShow':
+ if ($this->getUserAccessLevel('candidates.hidden') < ACCESS_LEVEL_MULTI_SA)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->administrativeHideShow();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
/* Delete a candidate attachment */
- case 'deleteAttachment':
- if ($this->getUserAccessLevel('candidates.deleteAttachment') < ACCESS_LEVEL_DELETE)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->onDeleteAttachment();
- break;
+ case 'deleteAttachment':
+ if ($this->getUserAccessLevel('candidates.deleteAttachment') < ACCESS_LEVEL_DELETE)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->onDeleteAttachment();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
/* Hot List Page */
/* FIXME: function savedList() missing
@@ -331,30 +366,51 @@ public function handleRequest()
$this->mergeDuplicates();
break;
- case 'mergeInfo':
- if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->mergeDuplicatesInfo();
- break;
+ case 'mergeInfo':
+ if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->mergeDuplicatesInfo();
+ }
+ else
+ {
+ CommonErrors::fatal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
/* Remove duplicity warning from a new candidate */
- case 'removeDuplicity':
- if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->removeDuplicity();
- break;
-
- case 'addDuplicates':
- if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
- {
- CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
- }
- $this->addDuplicates();
- break;
+ case 'removeDuplicity':
+ if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->removeDuplicity();
+ }
+ else
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
+
+ case 'addDuplicates':
+ if ($this->getUserAccessLevel('candidates.duplicates') < ACCESS_LEVEL_SA)
+ {
+ CommonErrors::fatal(COMMONERROR_PERMISSION, $this, 'Invalid user level for action.');
+ }
+ if ($this->isPostBack())
+ {
+ $this->addDuplicates();
+ }
+ else
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADFIELDS, $this, 'Invalid request.');
+ }
+ break;
/* Main candidates page. */
case 'listByView':
@@ -388,11 +444,42 @@ public function publicAddCandidate($isModal, $transferURI, $moduleDirectory)
CommonErrors::fatalModal(COMMONERROR_RECORDERROR, $this, 'Failed to add candidate.');
}
- $transferURI = str_replace(
- '__CANDIDATE_ID__', $candidateID, $transferURI
- );
- CATSUtility::transferRelativeURI($transferURI);
- }
+ $transferURI = str_replace(
+ '__CANDIDATE_ID__', $candidateID, $transferURI
+ );
+
+ if (strpos($transferURI, 'a=addToPipeline') !== false)
+ {
+ parse_str($transferURI, $params);
+ $action = CATSUtility::getIndexName();
+ if (isset($params['m']) && isset($params['a']))
+ {
+ $action .= '?m=' . urlencode($params['m']) . '&a=' . urlencode($params['a']);
+ unset($params['m']);
+ unset($params['a']);
+ }
+
+ echo '';
+ echo '';
+ echo '';
+ echo '';
+ return;
+ }
+
+ CATSUtility::transferRelativeURI($transferURI);
+ }
/*
@@ -1404,15 +1491,15 @@ private function onEdit()
/*
* Called by handleRequest() to process deleting a candidate.
*/
- private function onDelete()
- {
- /* Bail out if we don't have a valid candidate ID. */
- if (!$this->isRequiredIDValid('candidateID', $_GET))
- {
- CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
- }
-
- $candidateID = $_GET['candidateID'];
+ private function onDelete()
+ {
+ /* Bail out if we don't have a valid candidate ID. */
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ $candidateID = $_POST['candidateID'];
if (!eval(Hooks::get('CANDIDATE_DELETE'))) return;
@@ -1558,33 +1645,33 @@ private function considerForJobSearch($candidateIDArray = array())
* Called by handleRequest() to process adding a candidate to a pipeline
* in the modal dialog.
*/
- private function onAddToPipeline()
- {
- /* Bail out if we don't have a valid job order ID. */
- if (!$this->isRequiredIDValid('jobOrderID', $_GET))
- {
- CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid job order ID.');
- }
-
- if (isset($_GET['candidateID']))
- {
- /* Bail out if we don't have a valid candidate ID. */
- if (!$this->isRequiredIDValid('candidateID', $_GET))
- {
- CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
- }
-
- $candidateIDArray = array($_GET['candidateID']);
- }
- else
- {
- if (!isset($_REQUEST['candidateIDArrayStored']) || !$this->isRequiredIDValid('candidateIDArrayStored', $_REQUEST, true))
- {
- CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidateIDArrayStored parameter.');
- return;
- }
-
- $candidateIDArray = $_SESSION['CATS']->retrieveData($_REQUEST['candidateIDArrayStored']);
+ private function onAddToPipeline()
+ {
+ /* Bail out if we don't have a valid job order ID. */
+ if (!$this->isRequiredIDValid('jobOrderID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid job order ID.');
+ }
+
+ if (isset($_POST['candidateID']))
+ {
+ /* Bail out if we don't have a valid candidate ID. */
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ $candidateIDArray = array($_POST['candidateID']);
+ }
+ else
+ {
+ if (!isset($_POST['candidateIDArrayStored']) || !$this->isRequiredIDValid('candidateIDArrayStored', $_POST, true))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidateIDArrayStored parameter.');
+ return;
+ }
+
+ $candidateIDArray = $_SESSION['CATS']->retrieveData($_POST['candidateIDArrayStored']);
if (!is_array($candidateIDArray))
{
@@ -1606,7 +1693,7 @@ private function onAddToPipeline()
}
- $jobOrderID = $_GET['jobOrderID'];
+ $jobOrderID = $_POST['jobOrderID'];
if (!eval(Hooks::get('CANDIDATE_ADD_TO_PIPELINE_PRE'))) return;
@@ -1855,22 +1942,22 @@ private function onAddActivityChangeStatus()
* Called by handleRequest() to process removing a candidate from the
* pipeline for a job order.
*/
- private function onRemoveFromPipeline()
- {
- /* Bail out if we don't have a valid candidate ID. */
- if (!$this->isRequiredIDValid('candidateID', $_GET))
- {
- CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
- }
-
- /* Bail out if we don't have a valid job order ID. */
- if (!$this->isRequiredIDValid('jobOrderID', $_GET))
- {
- CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid job order ID.');
- }
-
- $candidateID = $_GET['candidateID'];
- $jobOrderID = $_GET['jobOrderID'];
+ private function onRemoveFromPipeline()
+ {
+ /* Bail out if we don't have a valid candidate ID. */
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ /* Bail out if we don't have a valid job order ID. */
+ if (!$this->isRequiredIDValid('jobOrderID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid job order ID.');
+ }
+
+ $candidateID = $_POST['candidateID'];
+ $jobOrderID = $_POST['jobOrderID'];
if (!eval(Hooks::get('CANDIDATE_REMOVE_FROM_PIPELINE_PRE'))) return;
@@ -2360,22 +2447,22 @@ private function onCreateAttachment()
/*
* Called by handleRequest() to process deleting an attachment.
*/
- private function onDeleteAttachment()
- {
- /* Bail out if we don't have a valid attachment ID. */
- if (!$this->isRequiredIDValid('attachmentID', $_GET))
- {
- CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid attachment ID.');
- }
-
- /* Bail out if we don't have a valid candidate ID. */
- if (!$this->isRequiredIDValid('candidateID', $_GET))
- {
- CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
- }
-
- $candidateID = $_GET['candidateID'];
- $attachmentID = $_GET['attachmentID'];
+ private function onDeleteAttachment()
+ {
+ /* Bail out if we don't have a valid attachment ID. */
+ if (!$this->isRequiredIDValid('attachmentID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid attachment ID.');
+ }
+
+ /* Bail out if we don't have a valid candidate ID. */
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ $candidateID = $_POST['candidateID'];
+ $attachmentID = $_POST['attachmentID'];
if (!eval(Hooks::get('CANDIDATE_ON_DELETE_ATTACHMENT_PRE'))) return;
@@ -2391,24 +2478,24 @@ private function onDeleteAttachment()
//TODO: Document me.
//Only accessable by MSA users - hides this job order from everybody by
- private function administrativeHideShow()
- {
- /* Bail out if we don't have a valid joborder ID. */
- if (!$this->isRequiredIDValid('candidateID', $_GET))
- {
- CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid Job Order ID.');
- }
-
- /* Bail out if we don't have a valid status ID. */
- if (!$this->isRequiredIDValid('state', $_GET, true))
- {
- CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid state ID.');
- }
-
- $candidateID = $_GET['candidateID'];
-
- // FIXME: Checkbox?
- $state = (boolean) $_GET['state'];
+ private function administrativeHideShow()
+ {
+ /* Bail out if we don't have a valid joborder ID. */
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid Job Order ID.');
+ }
+
+ /* Bail out if we don't have a valid status ID. */
+ if (!$this->isRequiredIDValid('state', $_POST, true))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid state ID.');
+ }
+
+ $candidateID = $_POST['candidateID'];
+
+ // FIXME: Checkbox?
+ $state = (boolean) $_POST['state'];
$candidates = new Candidates($this->_siteID);
$candidates->administrativeHideShow($candidateID, $state);
@@ -3477,11 +3564,20 @@ private function findDuplicateCandidateSearch()
$this->_template->display('./modules/candidates/LinkDuplicity.tpl');
}
- private function mergeDuplicates()
- {
- $candidates = new Candidates($this->_siteID);
- $oldCandidateID = $_GET['oldCandidateID'];
- $newCandidateID = $_GET['newCandidateID'];
+ private function mergeDuplicates()
+ {
+ if (!$this->isRequiredIDValid('oldCandidateID', $_GET))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ if (!$this->isRequiredIDValid('newCandidateID', $_GET))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ $candidates = new Candidates($this->_siteID);
+ $oldCandidateID = $_GET['oldCandidateID'];
+ $newCandidateID = $_GET['newCandidateID'];
$rsOld = $candidates->getWithDuplicity($oldCandidateID);
$rsNew = $candidates->getWithDuplicity($newCandidateID);
@@ -3494,12 +3590,21 @@ private function mergeDuplicates()
$this->_template->display('./modules/candidates/Merge.tpl');
}
- private function mergeDuplicatesInfo()
- {
- $candidates = new Candidates($this->_siteID);
- $params = array();
- $params['firstName'] = $_POST['firstName'];
- $params['middleName'] = $_POST['middleName'];
+ private function mergeDuplicatesInfo()
+ {
+ $candidates = new Candidates($this->_siteID);
+ if (!$this->isRequiredIDValid('oldCandidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ if (!$this->isRequiredIDValid('newCandidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+
+ $params = array();
+ $params['firstName'] = $_POST['firstName'];
+ $params['middleName'] = $_POST['middleName'];
$params['lastName'] = $_POST['lastName'];
if(isset($_POST['email']))
{
@@ -3512,37 +3617,54 @@ private function mergeDuplicatesInfo()
$params['phoneCell'] = $_POST['phoneCell'];
$params['phoneWork'] = $_POST['phoneWork'];
$params['phoneHome'] = $_POST['phoneHome'];
- $params['address'] = $_POST['address'];
- $params['website'] = $_POST['website'];
- $params['oldCandidateID'] = $_POST['oldCandidateID'];
- $params['newCandidateID'] = $_POST['newCandidateID'];
-
- $candidates->mergeDuplicates($params, $candidates->getWithDuplicity($params['newCandidateID']));
- $this->_template->assign('isFinishedMode', true);
- $this->_template->display('./modules/candidates/Merge.tpl');
- }
+ $params['address'] = $_POST['address'];
+ $params['website'] = $_POST['website'];
+ $params['oldCandidateID'] = $_POST['oldCandidateID'];
+ $params['newCandidateID'] = $_POST['newCandidateID'];
+
+ $candidates->mergeDuplicates($params, $candidates->getWithDuplicity($params['newCandidateID']));
+ CATSUtility::transferRelativeURI(
+ 'm=candidates&a=show&candidateID=' . $params['oldCandidateID']
+ );
+ }
- private function removeDuplicity()
- {
- $candidates = new Candidates($this->_siteID);
- $oldCandidateID = $_GET['oldCandidateID'];
- $newCandidateID = $_GET['newCandidateID'];
- $candidates->removeDuplicity($oldCandidateID, $newCandidateID);
- $url = CATSUtility::getIndexName()."?m=candidates";
- header("Location: " . $url); /* Redirect browser */
- exit();
- }
+ private function removeDuplicity()
+ {
+ $candidates = new Candidates($this->_siteID);
+ if (!$this->isRequiredIDValid('oldCandidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ if (!$this->isRequiredIDValid('newCandidateID', $_POST))
+ {
+ CommonErrors::fatal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ $oldCandidateID = $_POST['oldCandidateID'];
+ $newCandidateID = $_POST['newCandidateID'];
+ $candidates->removeDuplicity($oldCandidateID, $newCandidateID);
+ $url = CATSUtility::getIndexName()."?m=candidates";
+ header("Location: " . $url); /* Redirect browser */
+ exit();
+ }
- private function addDuplicates()
- {
- $candidates = new Candidates($this->_siteID);
- $oldCandidateID = $_GET['candidateID'];
- $newCandidateID = $_GET['duplicateCandidateID'];
- $candidates->addDuplicates($newCandidateID, $oldCandidateID);
- $this->_template->assign('isFinishedMode', true);
- $this->_template->display('./modules/candidates/LinkDuplicity.tpl');
- }
+ private function addDuplicates()
+ {
+ $candidates = new Candidates($this->_siteID);
+ if (!$this->isRequiredIDValid('candidateID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ if (!$this->isRequiredIDValid('duplicateCandidateID', $_POST))
+ {
+ CommonErrors::fatalModal(COMMONERROR_BADINDEX, $this, 'Invalid candidate ID.');
+ }
+ $oldCandidateID = $_POST['candidateID'];
+ $newCandidateID = $_POST['duplicateCandidateID'];
+ $candidates->addDuplicates($newCandidateID, $oldCandidateID);
+ $this->_template->assign('isFinishedMode', true);
+ $this->_template->display('./modules/candidates/LinkDuplicity.tpl');
+ }
}
?>
diff --git a/modules/candidates/ConsiderSearchModal.tpl b/modules/candidates/ConsiderSearchModal.tpl
index cc0150418..82317b95b 100755
--- a/modules/candidates/ConsiderSearchModal.tpl
+++ b/modules/candidates/ConsiderSearchModal.tpl
@@ -72,9 +72,14 @@
This maintenance action must be triggered via POST.
', + 'This starts the attachment reindex process.
', + 'This maintenance action must be triggered via POST.
', + 'This starts the attachment migration to the three-directory layout.
', + 'This maintenance action must be triggered via POST.
', + 'This page starts maintenance mode and related installer tasks.
', + '