generateCliAuthToken($keyToken, $cronTaskName, 300 * 10); * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token); */ /* @usage - inside cli script with args: * $cronTaskName = 'forceTablePerms'; * $keyToken = 'bash_force_table_perms'; * $token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10); * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => 3, 'table' => 'CRM_PROCES' ]); */ // TEST: $ php SE/se-lib/Route/Cron-test.php biuro.biall-net.pl class Route_Cron extends RouteBase { public function handleAuth() { if (User::logged()) { } else if ($this->authByToken()) { } else throw new HttpException('Unauthorized', 401); } public function generateCliAuthToken($cliKey, $task, $ttl = 300) { $generatedToken = uniqid(); $parts = array(); $parts[] = $generatedToken; $parts[] = $task; $parts[] = $ttl; $parts[] = time(); $token = implode(",", $parts); $sqlCliKey = "CronCliAuthToken:{$cliKey}"; $sth = DB::getPDO()->prepare(" insert into CRM_CONFIG (CONF_KEY, CONF_VAL) values ( :cliKey, :token ) on duplicate key update CONF_VAL = :token "); $sth->bindValue(':cliKey', $sqlCliKey, PDO::PARAM_STR); $sth->bindValue(':token', $token, PDO::PARAM_STR); $sth->execute(); return $generatedToken; } public function authByToken() { $cliKey = V::get('_key', '', $_REQUEST); $cliToken = V::get('_token', '', $_REQUEST); $sqlCliKey = "CronCliAuthToken:{$cliKey}"; $sth = DB::getPDO()->prepare(" select c.CONF_VAL from CRM_CONFIG c where CONF_KEY = :cliKey order by c.ID desc limit 1 "); $sth->bindValue(':cliKey', $sqlCliKey, PDO::PARAM_STR); $sth->execute(); $rawToken = $sth->fetch(); if (!$rawToken || !$rawToken['CONF_VAL']) throw new HttpException("Unauthorized - token not found #1-" . __LINE__, 401); $rawToken = explode(',', $rawToken['CONF_VAL']); DBG::_('DBG_CRON', '>1', 'rawToken', $rawToken, __CLASS__, __FUNCTION__, __LINE__); if (4 != count($rawToken)) throw new HttpException("Unauthorized - token not found #2-" . __LINE__, 401); if ($cliToken != $rawToken[0]) throw new HttpException("Unauthorized - token not found #3-" . __LINE__, 401); $task = $rawToken[1]; $ttl = (int)$rawToken[2]; $createDateTimestamp = (int)$rawToken[3]; if (!$ttl) throw new HttpException("Unauthorized - token not found #4-" . __LINE__, 401); if (!$createDateTimestamp) throw new HttpException("Unauthorized - token not found #5-" . __LINE__, 401); DBG::_('DBG_CRON', '>1', 'rawToken', array('createDateTimestamp'=>$createDateTimestamp, 'ttl'=>$ttl, 'cur'=>time()), __CLASS__, __FUNCTION__, __LINE__); if ($createDateTimestamp + $ttl < time()) { // TODO: remove record from table - one time action? throw new HttpException("Unauthorized - token expired #6-" . __LINE__, 401); } session_write_close();// changes in $_SESSION visible only in current process $_SESSION['AUTHORIZE_USER'] = 'anonymous'; $_SESSION['ADM_NAME'] = 'Anonymous'; $_SESSION['ADM_ACCOUNT'] = $_SERVER['REMOTE_ADDR']; $_SESSION['ADM_ADMIN_LEVEL'] = 10; $_SESSION['ADM_ID'] = 9999999999; DBG::_('DBG_CRON', '>1', 'rawToken', array('createDateTimestamp'=>$createDateTimestamp, 'ttl'=>$ttl, 'cur'=>time()), __CLASS__, __FUNCTION__, __LINE__); $this->runTask($task); exit; } public function executeCurlTastByToken($cronTaskName, $keyToken, $token, $args = []) { // @require $_SERVER['SERVER_NAME'] $baseUrl = "https://{$_SERVER['SERVER_NAME']}/SE"; if ('biuro.biall-net.pl' == $_SERVER['SERVER_NAME']) $baseUrl = "https://{$_SERVER['SERVER_NAME']}/SE/version-git"; // if ('biuro.biall-net.pl' == $_SERVER['SERVER_NAME']) $baseUrl = "https://{$_SERVER['SERVER_NAME']}/dev-pl/se-master"; // DBG //file_get_contents("https://{$baseUrl}/index.php?_route=Cron&_key={$keyToken}&_token={$token}&_task=sendNotify"); $url = "{$baseUrl}/index.php?_route=Cron&_key={$keyToken}&_token={$token}&_task={$cronTaskName}"; if (!empty($args)) $url .= "&" . implode("&", array_map(function ($key, $val) { return "{$key}={$val}"; }, array_keys($args), array_values($args))); $ch = curl_init(); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $return = curl_exec($ch); curl_close($ch); return $return; } public function defaultAction() { Lib::loadClass('UI'); UI::gora(); echo UI::h('div', [ 'class' => "container" ], [ UI::h('h1', [], "Cron"), "...", ]); UI::dol(); } public function dbgClearNofityAction() { Lib::loadClass('UI'); UI::gora(); try { DB::getPDO()->execSql("update `CRM_NOTIFY` set `last_exec_time` = null"); UI::alert('info', "Notify cleared"); } catch (Exception $e) { UI::alert('danger', "Error: " . $e->getMessage()); } UI::dol(); } public function dbgChangeNofityToDayBeforeAction() { Lib::loadClass('UI'); UI::gora(); try { DB::getPDO()->execSql("update `CRM_NOTIFY` set `last_exec_time` = DATE_SUB(NOW(), INTERVAL 1 DAY)"); UI::alert('info', "Notify cleared"); } catch (Exception $e) { UI::alert('danger', "Error: " . $e->getMessage()); } UI::dol(); } public function sendNotifyAction() { Lib::loadClass('UI'); $notify = Router::getRoute('Notify'); $todoReminders = array(); if (V::get('DBG_CRON', null, $_GET) > 0) UI::gora(); echo '
' . "\n"; echo '

Cron

' . "\n"; try { if (V::get('DBG_CRON', null, $_GET) > 0) DBG::table("reminders state - before", DB::getPDO()->fetchAll("select * from CRM_NOTIFY order by last_exec_time limit 20"), __CLASS__, __FUNCTION__, __LINE__); {// limit send time to 8 - 20 $timeNow = time(); $timeSendLimitFrom = mktime(8, 0, 0, date('n'), date('j'), date('Y')); $timeSendLimitTo = mktime(20, 0, 0, date('n'), date('j'), date('Y')); $dayNrNow = date('N'); $daysAllowed = array(1, 2, 3, 4, 5);// 1 = PoniedziaƂek, ... , 6 - Sobota, 7 - Niedziela if ($timeNow > $timeSendLimitFrom && $timeNow < $timeSendLimitTo && in_array($dayNrNow, $daysAllowed)) { $todoReminders = $notify->getTodoList(2, array('once_a_day', 'immediately')); } } DBG::_('DBG_CRON', '>0', 'todoReminders', $todoReminders, __CLASS__, __FUNCTION__, __LINE__); foreach ($todoReminders as $who => $userReminders) { echo "

Sending to {$who} reminders {" . json_encode($userReminders) . "}

" . "\n"; //$notify->sendUserReminders($who, $userReminders, $forceMail = 'plabudda@biall-net.pl');// TEST $notify->sendUserReminders($who, $userReminders); foreach ($userReminders as $when => $listWhat) { if (!empty($listWhat)) { // $reminders = array_keys($listWhat); // echo "

Sending to {$who} reminders [" . implode(",", $reminders) . "] at '{$when}'

" . "\n"; // $notify->send($who, $listWhat, $when, $forceMail = 'plabudda@biall-net.pl'); $notify->markAsSent($who, $listWhat, $when); } } } if (V::get('DBG_CRON', null, $_GET) > 0) DBG::table("reminders state - after", DB::getPDO()->fetchAll("select * from CRM_NOTIFY order by last_exec_time limit 20"), __CLASS__, __FUNCTION__, __LINE__); } catch (Exception $e) { UI::alert('danger', "#" . $e->getLine() . ":" . $e->getMessage()); } echo "\n" . '
';// .container echo "\n.EOF\n"; } public function checkInstallAction() { Lib::loadClass('Router'); { ob_start(); Router::getRoute('Status')->updateObjectCachePostTask(); $out = ob_get_clean(); echo " - Storage acl cache checked\n"; } $routeToReinstallList = array(); //$routeToReinstallList[] = 'Config';// Config must work before (url token) $routeToReinstallList[] = 'Msgs'; $routeToReinstallList[] = 'FixProjectPath'; $routeToReinstallList[] = 'FixZasobPath'; $routeToReinstallList[] = 'FixCrmProcesInitIdx'; $routeToReinstallList[] = 'Notify'; $routeToReinstallList[] = 'UrlAction_WmsGenerate'; // $routeToReinstallList[] = 'FileStorage';// reinstall in bash_install_check.php foreach ($routeToReinstallList as $routeName) { $route = Router::getRoute($routeName); $route->reinstall(); echo " - {$routeName} checked\n"; } echo "\n.EOF\n"; } /* @usage - inside cli script with args: * $cronTaskName = 'forceTablePerms'; * $keyToken = 'bash_force_table_perms'; * $token = Router::getRoute('Cron')->generateCliAuthToken($keyToken, $cronTaskName, 300 * 10); * $output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => 3, 'table' => 'CRM_PROCES' ]); */ public function forceTablePermsAction() { $idGroup = V::get('idGroup', 0, $_GET, 'int'); if (!$idGroup) throw new Exception("Missing idGroup"); $table = V::get('table', '', $_GET, 'word'); if (!$table) throw new Exception("Missing table"); Lib::loadClass('UsersLdapHelper'); $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup); if (empty($groupsNetwork)) throw new Exception("Group {$idGroup} not found"); foreach ($groupsNetwork as $vGroup) { echo "Will try to update table {$table} set A_CLASSIFIED='{$vGroup->cn}', A_ADM_COMPANY='{$vGroup->cn}' ;" . "\n"; DB::getPDO()->execSql("update `{$table}` set `A_CLASSIFIED`='{$vGroup->cn}', `A_ADM_COMPANY`='{$vGroup->cn}' "); } echo "DONE"; } public function forceSyncUserAction() { $usrLogin = V::get('usrLogin', 0, $_GET, 'login'); if (!$usrLogin) throw new Exception("Missing usrLogin"); Lib::loadClass('Router'); Lib::loadClass('UsersLdapHelper'); $usrStorageDB = UserStorageFactory::getStorage('DB'); $usrStorageLdap = UserStorageFactory::getStorage('MacOSX'); $forceSync = 1; Router::getRoute('Users')->syncUser($usrLogin, $usrStorageDB, $usrStorageLdap, $forceSync); echo "DONE"; } public function forceSyncGroupAction() { $idGroup = V::get('idGroup', 0, $_GET, 'int'); if (!$idGroup) throw new Exception("Missing idGroup"); Lib::loadClass('Router'); Lib::loadClass('UsersLdapHelper'); $usrStorageDB = UserStorageFactory::getStorage('DB'); $usrStorageLdap = UserStorageFactory::getStorage('MacOSX'); $forceSync = 1; Router::getRoute('Users')->syncGroup($idGroup, $usrStorageDB, $usrStorageLdap, $forceSync); echo "DONE"; } public function addUserAction() { //$output = Router::getRoute('Cron')->executeCurlTastByToken($cronTaskName, $keyToken, $token, [ 'idGroup' => $groupID, 'usrLogin' => $usrLogin , 'ADM_ADMIN_LEVEL' => $ADM_ADMIN_LEVEL, 'ADM_NAME' => $ADM_NAME, 'ADM_ADMIN_DESC' => $ADM_ADMIN_DESC, 'EMPLOYEE_TYPE' => $EMPLOYEE_TYPE, 'ADM_PASSWD' => $ADM_PASSWD, 'A_ADM_COMPANY' => $A_ADM_COMPANY, 'A_CLASSIFIED' => $A_CLASSIFIED ]); $idGroup = V::get('idGroup', 0, $_GET, 'int'); $usrLogin = V::get('usrLogin', 0, $_GET, 'login'); $idTelboxes = V::get('idTelboxes', 0, $_GET, 'int'); $ADM_ADMIN_LEVEL = V::get('ADM_ADMIN_LEVEL', 0, $_GET, 'int'); $ADM_NAME = V::get('ADM_NAME', 0, $_GET, 'word'); $ADM_ADMIN_DESC = V::get('ADM_ADMIN_DESC', 0, $_GET, 'word'); $EMPLOYEE_TYPE = V::get('EMPLOYEE_TYPE', 0, $_GET, 'word'); $ADM_PASSWD = V::get('ADM_PASSWD', 0, $_GET, 'word'); $idGroup_A_ADM_COMPANY = V::get('idGroup_A_ADM_COMPANY', 0, $_GET, 'int'); $idGroup_A_CLASSIFIED = V::get('idGroup_A_CLASSIFIED', 0, $_GET, 'int'); $idGroup_DEFAULT_ACL_GROUP = V::get('idGroup_DEFAULT_ACL_GROUP', 0, $_GET, 'int'); if (!$usrLogin) throw new Exception("Missing usrLogin"); Lib::loadClass('Router'); Lib::loadClass('UsersLdapHelper'); $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_A_ADM_COMPANY); if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_ADM_COMPANY} not found"); foreach ($groupsNetwork as $vGroup) { $A_ADM_COMPANY = $vGroup->cn; } $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_A_CLASSIFIED); if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_CLASSIFIED} not found"); foreach ($groupsNetwork as $vGroup) { $A_CLASSIFIED = $vGroup->cn; } $groupsNetwork = UsersLdapHelper::getGroupsByID($idGroup_DEFAULT_ACL_GROUP); if (empty($groupsNetwork)) throw new Exception("Group {$idGroup_A_CLASSIFIED} not found"); foreach ($groupsNetwork as $vGroup) { $DEFAULT_ACL_GROUP = $vGroup->cn; } Router::getRoute('Users')->addUser($usrLogin, $idGroup, $idTelboxes, $ADM_ADMIN_LEVEL, $ADM_NAME, $ADM_ADMIN_DESC, $EMPLOYEE_TYPE, $ADM_PASSWD, $A_ADM_COMPANY, $A_CLASSIFIED, $DEFAULT_ACL_GROUP); echo "DONE"; } }