getRepository('\User\Entity\Profile') ->findOneBy(array('email' => $contract->data->Login['email'])); if (is_null($user) || $user->archived || !$user->passwordValid($contract->data->Login['pin'])) { return $contract->deviceError('Authentication Failure.', 'Could not authenticate user.'); } $authData = $user->toArray(array('company', 'permissions')); if ($authData['company']['jobState'] != 'Active') { return $contract->deviceError('Authentication Failure.', 'Dealership suspended, no authentication allowed.'); } if ($authData['jobState'] != 'Active') { return $contract->deviceError('Authentication Failure.', 'User account suspended, no authentication allowed.'); } $user->lastLogin = new \DateTime("now"); $user->ipAddress = $_SERVER['REMOTE_ADDR']; $log = new \User\Entity\AuthenticationLog(); $log->profile = $user; $log->ipAddress = $_SERVER['REMOTE_ADDR']; $em->persist($log); $em->flush(); \Utility\Registry::setAuthData($authData); return $contract->deviceSuccess('Authenticated.', \Utility\Registry::getAuthData()); } /** * Pin reset functionality for mobile devices. * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function deviceResetPin(\Workspace\Utility\ServiceInputParams $contract) { \Utility\Registry::clearAuthData(); $em = \Utility\Registry::getEntityManager(); $user = isset($contract->data->Login['email']) && !empty($contract->data->Login['email']) ? $em->getRepository('\User\Entity\Profile') ->findOneBy(array('email' => $contract->data->Login['email'])) : $em->getRepository('\User\Entity\Profile') ->findOneBy(array('mobile' => $contract->data->Login['mobile'])); if (is_null($user) || $user->archived) { return $contract->deviceError('Reset Pin Failure.', 'Could not locate user.'); } $pin = mt_rand(1000, 9999); $user->password = $pin; $em->flush(); \Utility\Debug::errorLog('PinReset: ' . $user->email, $pin); // Send notifications. $this->sendPinResetNotification(null, $user, $pin); return $contract->deviceSuccess('Pin Reset.', array()); } /** * Contract to reset users pin. * @param object|null $jobRecord * @param array $input * @return \Workspace\Contract\UseOnce */ public function contractForgotPassword($jobRecord, array $input = array()) { $options = new \Workspace\UseCase\Options(); $requirement = new \Workspace\UseCase\Requirement(); $requirement->addOptionalInput(array( 'Reset' => array( 'email' => 'String250', 'mobile' => 'String20' ) )); return new \Workspace\Contract\UseOnce($options, $requirement); } /** * Reset pin for user. * @param object|null $jobRecord * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function executeForgotPassword($jobRecord, \Workspace\Utility\ServiceInputParams $contract) { \Utility\Registry::clearAuthData(); $em = \Utility\Registry::getEntityManager(); $searchBy = array(); isset($contract->data->Reset['email']) && !empty($contract->data->Reset['email']) && $searchBy['email'] = $contract->data->Reset['email']; isset($contract->data->Reset['mobile']) && !empty($contract->data->Reset['mobile']) && $searchBy['mobile'] = $contract->data->Reset['mobile']; $user = $em->getRepository('\User\Entity\Profile') ->findOneBy($searchBy); if (is_null($user) || $user->archived) { return $contract->error('Reset Failure.', 'Could not reset pin.'); } $pin = mt_rand(1000, 9999); $user->password = $pin; $em->flush(); \Utility\Debug::errorLog('PinReset: ' . $user->email, $pin); $this->sendPinResetNotification(null, $user, $pin); return $contract->success('Pin Reset.', array()); } /** * Contract to login a user. * @param object|null $jobRecord * @param array $input * @return \Workspace\Contract\UseOnce */ public function contractLogin($jobRecord, array $input = array()) { \Utility\Registry::clearAuthData(); $options = new \Workspace\UseCase\Options(); $requirement = new \Workspace\UseCase\Requirement(); $requirement->addRequiredInput(array( 'Login' => array( 'email' => 'Email', 'pin' => 'String50' ) )); return new \Workspace\Contract\UseOnce($options, $requirement); } /** * Login a user. * @param object|null $jobRecord * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function executeLogin($jobRecord, \Workspace\Utility\ServiceInputParams $contract) { \Utility\Registry::clearAuthData(); \Utility\Registry::clearSessionData(); $em = \Utility\Registry::getEntityManager(); $user = $em->getRepository('\User\Entity\Profile') ->findOneBy(array('email' => $contract->data->Login['email'])); if (is_null($user) || $user->archived || !$user->passwordValid($contract->data->Login['pin'])) { return $contract->error('Authentication Failure.', 'Could not authenticate user.'); } $authData = $user->toArray(array( 'company', 'tradeCenter', 'group', 'groupDivision', 'permissions', 'city', 'region', 'contact', 'manager' )); $auctionOpenDays = array(); if ($authData['company'] && isset($authData['company']['group']) && is_array($authData['company']['group']) && !empty($authData['company']['group'])) { $openDays = $this->em->createQuery( "SELECT openDayGroup, openDay " . "FROM \\Auction\\Entity\\OpenDayGroup openDayGroup " . "JOIN openDayGroup.openDay openDay " . "WHERE IDENTITY(openDayGroup.companyGroup) = :groupId " . "AND openDay.openDate >= :minDate" ) ->setParameter('groupId', $authData['company']['group']['id']) ->setParameter('minDate', new \DateTime('now')) ->getArrayResult(); foreach ($openDays as $openDay) { $date = $openDay['openDay']['openDate']->format('Y-m-d'); $auctionOpenDays[$date] = $date; } } $authData['auctionOpenDays'] = $auctionOpenDays; if ($authData['company']['jobState'] != 'Active') { return $contract->error('Authentication Failure.', 'Dealership suspended, no authentication allowed.'); } if ($authData['jobState'] != 'Active') { return $contract->error('Authentication Failure.', 'User account suspended, no authentication allowed.'); } $user->lastLogin = new \DateTime("now"); $user->ipAddress = $_SERVER['REMOTE_ADDR']; $log = new \User\Entity\AuthenticationLog(); $log->profile = $user; $log->ipAddress = $_SERVER['REMOTE_ADDR']; $em->persist($log); $em->flush(); $authData['config'] = $em ->getRepository('Config\Entity\Config') ->find(1) ->toArray(); \Utility\Registry::setAuthData($authData); switch (\Utility\Registry::getUserType()) { case 'Group User': if (!$authData['permissions']['suDivisionFull']) { \Utility\Registry::setAuthSudo( 'Division', $authData['company']['groupDivision']['name'], $authData['company']['groupDivision']['id'] ); } break; case 'Dealer Principle': break; } $authData['servertime'] = time(); return $contract->success('Authenticated.', $authData); } public function contractLogout($jobRecord, array $input = array()) { \Utility\Registry::clearAuthData(); $options = new \Workspace\UseCase\Options(); $requirement = new \Workspace\UseCase\Requirement(); $requirement->addRequiredInput(array()); return new \Workspace\Contract\UseOnce($options, $requirement); } /** * Login a user. * @param object|null $jobRecord * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function executeLogout($jobRecord, \Workspace\Utility\ServiceInputParams $contract) { \Utility\Registry::clearAuthData(); \Utility\Registry::clearSessionData(); return $contract->success('Logged out.', array()); } /** * Contract to login a user. * @param object|null $jobRecord * @param array $input * @return \Workspace\Contract\UseOnce */ public function contractActiveAccount($jobRecord, array $input = array()) { if (!\Utility\Registry::isAuthenticated()) { throw new \Exception('Not Authenticated.'); } $options = new \Workspace\UseCase\Options(); $requirement = new \Workspace\UseCase\Requirement(); $requirement->addRequiredInput(array()); $contract = new \Workspace\Contract\UseOnce($options, $requirement); $authData = \Utility\Registry::getAuthData(); if (isset($authData['pin'])) { unset($authData['pin']); } if (isset($authData['password'])) { unset($authData['password']); } if (isset($authData['salt'])) { unset($authData['salt']); } $authData['servertime'] = time(); return $contract->setData( $authData ); } public function executeActiveAccount($jobRecord, \Workspace\Utility\ServiceInputParams $contract) { return $contract->success('DevNull.', array()); } /** * ExecuteAfter: Update. * Send welcome notification with new pin for user just registered/created on system. * @param array $meta * @param object|null $jobRecord * @param object|null $record * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function updateAuthSession($meta, $jobRecord, $record, \Workspace\Utility\ServiceInputParams $contract) { #-> Do we need to update session data? if (\Utility\Registry::getAuthParam('id') == $record->id) { $authData = $record->toArray(array( 'company', 'group', 'groupDivision', 'permissions', 'city', 'region', 'contact', 'manager' )); \Utility\Registry::setAuthData($authData); } } /** * ExecuteAfter: Create. * Send welcome notification with new pin for user just registered/created on system. * @param array $meta * @param object|null $jobRecord * @param object|null $record * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function sendWelcomeNotification($meta, $jobRecord, $record, \Workspace\Utility\ServiceInputParams $contract) { #-> Pin generated by \User\Entity\Profile::fromArray() $pin = \Utility\Registry::checkOnce('NewUser.Pin'); $record = !is_null($record) ? $record->toArray() : $jobRecord->toArray(); //echo '
' . print_r($record, true) . '
'; $authData = \Utility\Registry::getAuthData(); //echo '
' . print_r($authData, true) . '
'; $fromCompanyId = !is_null($authData) && isset($authData['company']['id']) ? $authData['company']['id'] : null; $fromProfileId = !is_null($authData) && isset($authData['id']) ? $authData['id'] : null; $toCompanyId = isset($record['company']['id']) ? $record['company']['id'] : null; $toProfileId = isset($record['id']) ? $record['id'] : null; $email = isset($record['email']) ? $record['email'] : null; $mobile = null; $subject = null; $templateName = 'new-profile-recipient'; $params = array(); $params['firstName'] = $record['firstName']; $params['familyName'] = $record['familyName']; $params['email'] = $record['email']; $params['pin'] = $pin; #-> Send welcome notification. $oNotify = new \Utility\Comms\Notification(); $oNotify->sendFromTemplate( $fromCompanyId, $fromProfileId, $toCompanyId, $toProfileId, $email, $mobile, $subject, $templateName, $params ); } public function sendPinResetNotification($jobRecord, $record, $pin) { $record = !is_null($record) ? $record->toArray(array('company')) : $jobRecord->toArray(array('company')); $authData = \Utility\Registry::getAuthData(); $fromCompanyId = isset($authData['company']['id']) ? $authData['company']['id'] : null; $fromProfileId = isset($authData['id']) ? $authData['id'] : null; $toCompanyId = isset($record['company']['id']) ? $record['company']['id'] : null; $toProfileId = isset($record['id']) ? $record['id'] : null; $email = isset($record['email']) ? $record['email'] : null; $mobile = isset($record['mobile']) ? $record['mobile'] : null; $subject = null; $templateName = 'forgot-pin'; $params = array(); $params['firstName'] = $record['firstName']; $params['familyName'] = $record['familyName']; $params['email'] = $record['email']; $params['pin'] = $pin; #-> Send welcome notification. $oNotify = new \Utility\Comms\Notification(); $oNotify->sendFromTemplate( $fromCompanyId, $fromProfileId, $toCompanyId, $toProfileId, $email, $mobile, $subject, $templateName, $params ); \Utility\Debug::errorLog("sendPinResetNotification","sms:".$mobile." email:".$email); } /** * Contract to set sudo filter. * @param object|null $jobRecord * @param array $input * @return \Workspace\Contract\UseOnce */ public function contractSetSu($jobRecord, array $input = array()) { $options = new \Workspace\UseCase\Options(); $requirement = new \Workspace\UseCase\Requirement(); $requirement->addOptionalInput(array( 'Sudo' => array( 'Group' => 'Integer', 'Division' => 'Integer', 'Company' => 'Integer' ) )); return new \Workspace\Contract\Recurring($options, $requirement); } /** * Set sudo filter. * @param object|null $jobRecord * @param \Workspace\Utility\ServiceInputParams $contract * @return array */ public function executeSetSu($jobRecord, \Workspace\Utility\ServiceInputParams $contract) { if (isset($contract->data->Sudo['Group'])) { $id = 0 == $contract->data->Sudo['Group'] ? false : $contract->data->Sudo['Group']; $name = ''; if ($id) { $item = $this->em->getRepository('\Company\Entity\Group') ->find($id); if (!is_null($item)) { $name = $item->name; } } \Utility\Registry::setAuthSudo('Group', $name, $id); \Utility\Registry::setAuthSudo('Division', '', false); \Utility\Registry::setAuthSudo('Company', '', false); } if (isset($contract->data->Sudo['Division'])) { $id = 0 == $contract->data->Sudo['Division'] ? false : $contract->data->Sudo['Division']; $name = ''; if ($id) { $item = $this->em->getRepository('\Company\Entity\GroupDivision') ->find($id); if (!is_null($item)) { $name = $item->name; } } \Utility\Registry::setAuthSudo('Division', $name, $id); \Utility\Registry::setAuthSudo('Company', '', false); } if (isset($contract->data->Sudo['Company'])) { $id = 0 == $contract->data->Sudo['Company'] ? false : $contract->data->Sudo['Company']; $name = ''; if ($id) { $item = $this->em->getRepository('\Company\Entity\Company') ->find($id); if (!is_null($item)) { $name = $item->name; } } \Utility\Registry::setAuthSudo('Company', $name, $id); } return $contract->success('Filter set.', array()); } }