This Documentation Applies to CATS Version 0.6.1 |
---|
The CATS Team has since released new versions, the material documented here likely will not work on the new versions without modification. |
This patch adds the session_name to the session cookies so CATS does not interfere with other PHP applications running on the same server. Without the session_name, those other applications can step on CATS saved session information, and vice versa.
Index: trunk/index.php =================================================================== --- trunk/index.php (revision 1) +++ trunk/index.php (working copy) @@ -51,6 +51,7 @@ include_once('./lib/Session.php'); /* Depends on ArrayUtility, Users, and DatabaseConnection. */ include_once('./lib/UserInterface.php'); /* Depends on Template. */ +session_name('CATS'); session_start(); /* Try to prevent caching. */ Index: trunk/lib/AJAXInterface.php =================================================================== --- trunk/lib/AJAXInterface.php (revision 1) +++ trunk/lib/AJAXInterface.php (working copy) @@ -109,6 +109,7 @@ public function __construct() { + session_name('CATS'); session_start(); /* Validate the session. */
This patch removes old client selection code from the contacts page. This code would substantially slow down the contact display on systems with large numbers of clients.
Index: trunk/modules/contacts/Edit.tpl =================================================================== --- trunk/modules/contacts/Edit.tpl (revision 1) +++ trunk/modules/contacts/Edit.tpl (working copy) @@ -61,20 +61,6 @@ <div id="ClientResults" class="ajaxSearchResults"></div> </td> - <!-- old client id selection code follows - <td class="tdData"> - <select id="clientID" name="clientID" class="inputbox" style="width: 150px;"> - <option value="">(Select a Client)</option> - - <?php foreach ($this->clientsRS as $rowNumber => $clientsData): ?> - <?php if ($this->data['clientID'] == $clientsData['clientID']): ?> - <option selected value="<?php $this->_($clientsData['clientID']) ?>"><?php $this->_($clientsData['name']) ?></option> - <?php else: ?> - <option value="<?php $this->_($clientsData['clientID']) ?>"><?php $this->_($clientsData['name']) ?></option> - <?php endif; ?> - <?php endforeach; ?> - </select> * - </td>--> </tr> <tr>
This patch fixes incorrect javascript file references in various templates.
Index: trunk/modules/activity/Search.tpl =================================================================== --- trunk/modules/activity/Search.tpl (revision 1) +++ trunk/modules/activity/Search.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Search.tpl 789 2006-09-08 07:41:24Z will $ */ ?> -<?php TemplateUtility::printHeader('Activities', array('js/highlightrows.js', 'modules/activity/validator.js', 'js/addEvent.js', 'js/sweetTitles.js')); ?> +<?php TemplateUtility::printHeader('Activities', array('js/highlightrows.js', 'modules/activity/validator.js', 'js/sweetTitles.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> Index: trunk/modules/activity/Activity.tpl =================================================================== --- trunk/modules/activity/Activity.tpl (revision 1) +++ trunk/modules/activity/Activity.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Activity.tpl 928 2006-09-19 12:43:00Z will $ */ ?> -<?php TemplateUtility::printHeader('Activities', array('js/highlightrows.js', 'js/addEvent.js', 'js/sweetTitles.js')); ?> +<?php TemplateUtility::printHeader('Activities', array('js/highlightrows.js', 'js/sweetTitles.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> <ul id="primary"> Index: trunk/modules/candidates/HotList.tpl =================================================================== --- trunk/modules/candidates/HotList.tpl (revision 1) +++ trunk/modules/candidates/HotList.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: HotList.tpl 789 2006-09-08 07:41:24Z will $ */ ?> -<?php TemplateUtility::printHeader('Candidates', array('js/submodal/subModal.js', 'js/highlightrows.js', 'js/addEvent.js', 'js/export.js', 'js/listEditor.js')); ?> +<?php TemplateUtility::printHeader('Candidates', array('js/submodal/subModal.js', 'js/highlightrows.js', 'js/sweetTitles.js', 'js/export.js', 'js/listEditor.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> <ul id="primary"> Index: trunk/modules/candidates/Candidates.tpl =================================================================== --- trunk/modules/candidates/Candidates.tpl (revision 1) +++ trunk/modules/candidates/Candidates.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Candidates.tpl 925 2006-09-18 21:15:07Z brian $ */ ?> -<?php TemplateUtility::printHeader('Candidates', array('js/submodal/subModal.js', 'js/highlightrows.js', 'js/addEvent.js', 'js/export.js', 'js/checkBox.js')); ?> +<?php TemplateUtility::printHeader('Candidates', array('js/submodal/subModal.js', 'js/highlightrows.js', 'js/sweetTitles.js', 'js/export.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> <ul id="primary"> Index: trunk/modules/clients/Clients.tpl =================================================================== --- trunk/modules/clients/Clients.tpl (revision 1) +++ trunk/modules/clients/Clients.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Clients.tpl 789 2006-09-08 07:41:24Z will $ */ ?> -<?php TemplateUtility::printHeader('Clients', array('js/highlightrows.js', 'js/addEvent.js', 'js/export.js')); ?> +<?php TemplateUtility::printHeader('Clients', array('js/highlightrows.js', 'js/sweetTitles.js', 'js/export.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> Index: trunk/modules/calendar/Calendar.tpl =================================================================== --- trunk/modules/calendar/Calendar.tpl (revision 1) +++ trunk/modules/calendar/Calendar.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Calendar.tpl 789 2006-09-08 07:41:24Z will $ */ ?> -<?php TemplateUtility::printHeader('Calendar', array('modules/calendar/Calendar.css', 'js/highlightrows.js', 'modules/calendar/Calendar.js', 'modules/calendar/CalendarUI.js', 'js/calendarDateInput.js', 'modules/calendar/validator.js')); ?> +<?php TemplateUtility::printHeader('Calendar', array('Calendar.css', 'js/highlightrows.js', 'modules/calendar/Calendar.js', 'modules/calendar/CalendarUI.js', 'js/calendarDateInput.js', 'modules/calendar/validator.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> <ul id="primary"> Index: trunk/modules/contacts/Contacts.tpl =================================================================== --- trunk/modules/contacts/Contacts.tpl (revision 1) +++ trunk/modules/contacts/Contacts.tpl (working copy) @@ -1,5 +1,5 @@ <?php /* $Id: Contacts.tpl 789 2006-09-08 07:41:24Z will $ */ ?> -<?php TemplateUtility::printHeader('Contacts', array('js/highlightrows.js', 'js/addEvent.js', 'js/export.js')); ?> +<?php TemplateUtility::printHeader('Contacts', array('js/highlightrows.js', 'js/sweetTitles.js', 'js/export.js')); ?> <?php TemplateUtility::printHeaderBlock(); ?> <div id="header"> <ul id="primary">
This patch alters the order types to the author's tastes.
Index: trunk/lib/JobOrders.php =================================================================== --- trunk/lib/JobOrders.php (revision 1) +++ trunk/lib/JobOrders.php (working copy) @@ -821,16 +821,16 @@ { switch ($typeCode) { - case 'C': - return 'Contract'; + case 'T': + return 'Temp'; break; case 'H'; return 'Hire'; break; - case 'C2H'; - return 'Contract to Hire'; + case 'T2H'; + return 'Temp to Hire'; break; default: Index: trunk/modules/joborders/Edit.tpl =================================================================== --- trunk/modules/joborders/Edit.tpl (revision 1) +++ trunk/modules/joborders/Edit.tpl (working copy) @@ -127,16 +127,16 @@ <select tabindex="12" id="type" name="type" class="inputbox" style="width: 150px;"> <?php if ($this->data['type'] == 'H'): ?> <option selected value="H">H (Hire)</option> - <option value="C2H">C2H (Contract to Hire)</option> - <option value="C">C (Contract)</option> - <?php elseif ($this->data['type'] == 'C2H'): ?> + <option value="T2H">T2H (Temp to Hire)</option> + <option value="T">T (Temp)</option> + <?php elseif ($this->data['type'] == 'T2H'): ?> <option value="H">H (Hire)</option> - <option selected value="C2H">C2H (Contract to Hire)</option> - <option value="C">C (Contract)</option> + <option selected value="T2H">T2H (Temp to Hire)</option> + <option value="T">T (Temp)</option> <?php else: ?> <option value="H">H (Hire)</option> - <option value="C2H">C2H (Contract to Hire)</option> - <option selected value="C">C (Contract)</option> + <option value="T2H">T2H (Temp to Hire)</option> + <option selected value="T">T (Temp)</option> <?php endif; ?> </select> * </td> Index: trunk/modules/joborders/Add.tpl =================================================================== --- trunk/modules/joborders/Add.tpl (revision 1) +++ trunk/modules/joborders/Add.tpl (working copy) @@ -173,8 +173,8 @@ <td class="tdData"> <select tabindex="7" id="type" name="type" class="inputbox" style="width: 150px;"> <option value="H">H (Hire)</option> - <option value="C2H">C2H (Contract to Hire)</option> - <option value="C">C (Contract)</option> + <option value="T2H">T2H (Temp to Hire)</option> + <option value="T">T (Temp)</option> </select> * </td> Index: trunk/modules/reports/JobOrderReport.tpl =================================================================== --- trunk/modules/reports/JobOrderReport.tpl (revision 1) +++ trunk/modules/reports/JobOrderReport.tpl (working copy) @@ -184,8 +184,8 @@ <td class="tdData"> <select tabindex="7" id="type" name="type" class="inputbox" style="width: 150px;"> <option value="H">H (Hire)</option> - <option value="C2H">C2H (Contract to Hire)</option> - <option value="C">C (Contract)</option> + <option value="T2H">T2H (Temp to Hire)</option> + <option value="T">T (Temp)</option> </select> * </td>
This patch fixes a logic bug encountered only on weekends for the activity graph. Additionally, it changes the graph to the past 14 days rather than the base system's display of this week and next week.
Index: trunk/lib/Dashboard.php =================================================================== --- trunk/lib/Dashboard.php (revision 1) +++ trunk/lib/Dashboard.php (working copy) @@ -70,6 +70,7 @@ $string = str_replace('((DATE))', date('m-d-y'), $string); $string = str_replace('((TIME))', date('g:i A'), $string); $string = str_replace('((LASTWEEKTHROUGHTHISWEEK))', date('m-d-y', $dateLastSun) . ' through ' . date('m-d-y', $dateThisSat), $string); + $string = str_replace('((LAST14DAYS))', date('m-d-y', strtotime("-13 days")) . ' through ' . date('m-d-y'), $string); $string = str_replace('((SITENAME))', $_SESSION['catsSession']->getSiteName(), $string); return $string; Index: trunk/modules/graphs/GraphsUI.php =================================================================== --- trunk/modules/graphs/GraphsUI.php (revision 1) +++ trunk/modules/graphs/GraphsUI.php (working copy) @@ -148,7 +148,7 @@ $RS = $statistics->getActivitiesByPeriod(STATISTICS_PERIOD_LASTTWOWEEKS); // FIXME: Factor out these calculations? Common to most of these graphs. - $firstDay = mktime(0, 0, 0, date('m'), date('d') - ((int) date('w')) - 7, date('Y')); + $firstDay = strtotime("-13 days"); /* Get Labels. */ $y = array(); @@ -165,15 +165,8 @@ foreach ($RS as $lineRS) { $thisDay = mktime(0, 0, 0, $lineRS['month'], $lineRS['day'], $lineRS['year']); - $dayOfWeek = (int) date('w', $thisDay); - if ((int) date('W', $thisDay) != (int) date('W')) - { - $x[$dayOfWeek]++; - } - else - { - $x[$dayOfWeek + 7]++; - } + $days = (int) ((strtotime(date('Y-m-d',$thisDay))) - strtotime(date('Y-m-d',$firstDay))) / (60 * 60 * 24); + $x[$days]++; } $graph = new GraphSimple($y, $x, 'DarkGreen', 'Weekly Activity', $this->width, $this->height); @@ -188,7 +181,7 @@ $statistics = new Statistics($this->_siteID); $RS = $statistics->getCandidatesByPeriod(STATISTICS_PERIOD_LASTTWOWEEKS); - $firstDay = mktime(0, 0, 0, date('m'), date('d') - ((int) date('w')) - 7, date('Y')); + $firstDay = strtotime("-13 days"); /* Get labels. */ $y = array(); @@ -203,15 +196,8 @@ foreach ($RS as $lineRS) { $thisDay = mktime(0, 0, 0, $lineRS['month'], $lineRS['day'], $lineRS['year']); - $dayOfWeek = (int) date('w', $thisDay); - if ((int) date('W', $thisDay) != (int) date('W')) - { - $x[$dayOfWeek]++; - } - else - { - $x[$dayOfWeek + 7]++; - } + $days = (int) ((strtotime(date('Y-m-d',$thisDay))) - strtotime(date('Y-m-d',$firstDay))) / (60 * 60 * 24); + $x[$days]++; } $graph = new GraphSimple($y, $x, 'Blue', 'New Candidates', $this->width, $this->height); @@ -227,7 +213,7 @@ $RS = $statistics->getJobOrdersByPeriod(STATISTICS_PERIOD_LASTTWOWEEKS); /* Get labels. */ - $firstDay = mktime(0, 0, 0, date('m'), date('d') - ((int) date('w')) - 7, date('Y')); + $firstDay = strtotime("-13 days"); $y = array(); for ($i = 0; $i < 14; $i++) @@ -241,15 +227,8 @@ foreach ($RS as $lineRS) { $thisDay = mktime(0, 0, 0, $lineRS['month'], $lineRS['day'], $lineRS['year']); - $dayOfWeek = (int) date('w', $thisDay); - if ((int) date('W', $thisDay) != (int) date('W')) - { - $x[$dayOfWeek]++; - } - else - { - $x[$dayOfWeek + 7]++; - } + $days = (int) ((strtotime(date('Y-m-d',$thisDay))) - strtotime(date('Y-m-d',$firstDay))) / (60 * 60 * 24); + $x[$days]++; } $graph = new GraphSimple($y, $x, 'Red', 'New Job Orders', $this->width, $this->height); @@ -348,7 +327,7 @@ $RS = $statistics->getSubmissionsByPeriod(STATISTICS_PERIOD_LASTTWOWEEKS); /* Get labels. */ - $firstDay = mktime(0, 0, 0, date('m'), date('d') - ((int) date('w')) - 7, date('Y')); + $firstDay = strtotime("-13 days"); $y = array(); for ($i = 0; $i < 14; $i++) @@ -362,15 +341,8 @@ foreach ($RS as $lineRS) { $thisDay = mktime(0, 0, 0, $lineRS['month'], $lineRS['day'], $lineRS['year']); - $dayOfWeek = (int) date('w', $thisDay); - if ((int) date('W', $thisDay) != (int) date('W')) - { - $x[$dayOfWeek]++; - } - else - { - $x[$dayOfWeek + 7]++; - } + $days = (int) ((strtotime(date('Y-m-d',$thisDay))) - strtotime(date('Y-m-d',$firstDay))) / (60 * 60 * 24); + $x[$days]++; } $graph = new GraphSimple($y, $x, 'Orange', 'New Submissions', $this->width, $this->height);
This patch causes the candidate's key skills field to be included in the candidate quick search.
Index: trunk/lib/Search.php =================================================================== --- trunk/lib/Search.php (revision 1) +++ trunk/lib/Search.php (working copy) @@ -505,6 +505,7 @@ OR candidate.email1 LIKE %s OR candidate.phone_home LIKE %s OR candidate.phone_cell LIKE %s + OR candidate.key_skills LIKE %s ) AND candidate.site_id = %s @@ -518,6 +519,7 @@ $wildCardString, $wildCardString, $wildCardString, + $wildCardString, $this->_siteID );
Thanks to CATS user Daniel Felzke CATS can be modified to authenticate via LDAP with ActiveDirectory. Daniel explains the steps needed in the thread here http://www.catsone.com/forum/viewtopic.php?id=187. Note that adLDAP Version 1.5 is the version included in Daniel's package, I'm not sure if the more recent Version 2.0 will work without mods though since I haven't tried it.
I had to make minor changes to Daniel's stuff to get it to work with my Windows 2003 ActiveDirectory server, but unfortunately, I did not keep track of my changes versus Daniel's so the patch documented here is really only for my own documentation purposes. Those who want to implement this authentication should follow Daniel's instructions at the link above, you shouldn't have any problem getting it to work.
Index: trunk/lib/Users.php =================================================================== --- trunk/lib/Users.php (revision 1) +++ trunk/lib/Users.php (working copy) @@ -96,7 +96,7 @@ %s, %s, %s, - %s + 1 )", $this->_db->makeQueryString($username), /* $this->_db->makeQueryString(self::hashPassword($password)), TODO 0.7 */ Index: trunk/lib/Session.php =================================================================== --- trunk/lib/Session.php (revision 1) +++ trunk/lib/Session.php (working copy) @@ -29,6 +29,7 @@ include_once('./lib/Mailer.php'); include_once('./lib/MRU.php'); +include_once('./lib/adLDAP.php'); class CATSSession { @@ -309,6 +310,190 @@ } } + public function processLDAPLogin($username, $password) + { + $db = DatabaseConnection::getInstance(); + + /* Is the login information supplied correct? Get the status flag. */ + $users = new Users(-1); + $adldap = new adLDAP(); + + if ((empty($username)) || (empty($password))) { + $this->_isLoggedIn = false; + $this->_loginError = 'You can not have an empty username or password.'; + + return; + + } + + if ($adldap->authenticate($username,$password)) + { + // Check Group Affiliation + $group=$adldap->user_groups($username); + if (array_search("Corporate", $group)) + { + $access_level = 400; + } + elseif (array_search("Branch Users", $group)) + { + $access_level = 300; + } + elseif (1 == 1) + { + $access_level = 200; + } + else + { + $this->_isLoggedIn = false; + $this->_loginError = 'You do not have access to this program.'; + + return; + } + + // Grab LDAP User Information + $fields = array("givenname", "sn", "samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","title"); + $info=$adldap->user_info($username, $fields); + + // Find out if user is already in CATS database. + $db = DatabaseConnection::getInstance(); + + $sql = sprintf( + "SELECT + user.user_id AS userID, + user.user_name AS username, + user.first_name AS firstName, + user.last_name AS lastName, + user.access_level AS accessLevel, + user.site_id AS userSiteID, + user.is_beta_tester AS isBetaTester, + user.*, + site.name AS siteName, + site.is_demo AS isDemo + FROM + user + LEFT JOIN site + ON site.site_id = user.site_id + WHERE + user.user_name = %s", + $db->makeQueryString($username) + ); + $rs = $db->getAssoc($sql); + + /* Is this the first time the user has logged in */ + if (!$rs || $db->isEOF()) + { + // Insert User + $new_user = $users->add($info[0]['sn'][0], $info[0]['givenname'][0], $info[0]['mail'][0], $info[0]['samaccountname'][0], NULL, $access_level); + // Get New details + $rs = $db->getAssoc($sql); + } + + $loginStatus = LOGIN_SUCCESS; + } + else + { + $loginStatus = LOGIN_INVALID_USER; + } + + if (array_key_exists('REMOTE_ADDR', $_SERVER)) + { + $ip = $_SERVER['REMOTE_ADDR']; + } + else + { + $ip = ''; + } + + if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) + { + $userAgent = $_SERVER['HTTP_USER_AGENT']; + } + else + { + $userAgent = ''; + } + + switch ($loginStatus) + { + case LOGIN_INVALID_PASSWORD: + $this->_isLoggedIn = false; + $this->_loginError = 'Invalid username or password.'; + + /* Log the login as unsuccessful. */ + $users->addLoginHistory( + $rs['userID'], + $rs['userSiteID'], + $ip, + $userAgent, + false + ); + + break; + + case LOGIN_DISABLED: + $this->_isLoggedIn = false; + $this->_loginError = 'Your account is disabled.'; + + /* Log the login as unsuccessful. */ + $users->addLoginHistory( + $rs['userID'], + $rs['userSiteID'], + $ip, + $userAgent, + false + ); + + break; + + case LOGIN_SUCCESS: + $this->_username = $rs['username']; + $this->_userID = $rs['userID']; + $this->_siteID = $rs['userSiteID']; + $this->_firstName = $rs['firstName']; + $this->_lastName = $rs['lastName']; + $this->_siteName = $rs['siteName']; + $this->_accessLevel = $rs['accessLevel']; + $this->_email = $rs['email']; + $this->_ip = $ip; + $this->_userAgent = $userAgent; + + if ($rs['isDemo'] == '1' && $_SERVER['REMOTE_ADDR'] != '127.0.0.1' && ENABLE_DEMO_MODE && $rs['isDemoUser'] == 1) + { + $this->_isDemo = true; + $this->_accessLevel = ACCESS_LEVEL_DEMO; + } + else + { + $this->_isDemo = false; + } + + if ($rs['isBetaTester'] == '1') + { + $this->_isBetaTester = true; + } + else + { + $this->_isBetaTester = false; + } + + /* Log the login as successful. */ + $users->addLoginHistory( + $this->_userID, + $this->_siteID, + $this->_ip, + $this->_userAgent, + true + ); + + /* Upon successful login, try to upgrade plaintext passwords. */ + /* $users->tryUpgradePassword($username, $password); TODO 0.6 */ + + $this->_isLoggedIn = true; + + break; + } + } + /** * Returns the error message for which the current login attempt failed. * Index: trunk/modules/login/LoginUI.php =================================================================== --- trunk/modules/login/LoginUI.php (revision 1) +++ trunk/modules/login/LoginUI.php (working copy) @@ -139,7 +139,7 @@ $password = $this->getTrimmedInput('password', $_POST); /* Make a blind attempt at logging the user in. */ - $_SESSION['catsSession']->processLogin($username, $password); + $_SESSION['catsSession']->processLDAPLogin($username, $password); /* If unsuccessful, take the user back to the login page. */ if (!$_SESSION['catsSession']->isLoggedIn())