diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index 68118948d..82e084d0f 100644 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -113,11 +113,11 @@ class RBAC 'downloadFileHash' => array('PM_FACTORY') ), 'processProxy.php' => array( - 'categoriesList' => array(), - 'getCategoriesList' => array(), + 'categoriesList' => array('PM_SETUP_PROCESS_CATEGORIES'), + 'getCategoriesList' => array('PM_FACTORY'), 'saveProcess' => array('PM_FACTORY'), - 'changeStatus' => array(), - 'changeDebugMode' => array(), + 'changeStatus' => array('PM_FACTORY'), + 'changeDebugMode' => array('PM_FACTORY'), 'getUsers' => array(), 'getGroups' => array(), 'assignActorsTask' => array(), @@ -128,7 +128,7 @@ class RBAC 'saveProperties' => array(), 'getCaledarList' => array(), 'getPMVariables' => array(), - 'generateBpmn' => array() + 'generateBpmn' => array('PM_FACTORY') ), 'home.php' => array( 'login' => array('PM_LOGIN'), @@ -148,6 +148,9 @@ class RBAC 'getProcesses' => array('PM_ALLCASES'), 'getUsers' => array('PM_ALLCASES') ), + 'newSite.php' => array( + 'newSite.php' => array('PM_SETUP_ADVANCE') + ), 'emailsAjax.php' => array( 'MessageList' => array('PM_SETUP', 'PM_SETUP_LOGS'), 'updateStatusMessage' => array(), diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 4feec1018..9e7654072 100644 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1386,35 +1386,44 @@ class Cases * * @name searchOpenPreviousTasks, * @param string $taskUid - * @param string $sAppUid - * @param array $aPreviousTasks optional array that serves to trace the task routes and avoid infinite loops. - * @return $aThreads + * @param string $appUid + * @param array $previousTasks, optional array that serves to trace the task routes and avoid infinite loops. + * @return array, information about the threads in the case */ - public function searchOpenPreviousTasks($taskUid, $sAppUid, $aPreviousTasks = array()) + public function searchOpenPreviousTasks($taskUid, $appUid, $previousTasks = array()) { - //in this array we are storing all open delegation rows. - $aTaskReviewed = array(); + //In this array we are storing all open delegation rows. + $threads = array(); - //check if this task ( $taskUid ) has open delegations - $delegations = $this->getReviewedTasks($taskUid, $sAppUid); + //Check if this $taskUid has open delegations, this is a single review + $threads = $this->getReviewedTasks($taskUid, $appUid); - if ($delegations !== false) { - if (count($delegations['open']) > 0) { - //there is an open delegation, so we need to return the delegation row - return $delegations['open']; + if ($threads !== false) { + if (count($threads['open']) > 0) { + //There is an open delegation, so we need to return the delegation row + return $threads['open']; } else { - if(count($delegations['paused']) > 0){ + if (count($threads['paused']) > 0) { //there is an paused delegation, so we need to return the delegation row - return $delegations['paused']; - }else{ - return array(); //returning empty array + return $threads['paused']; } } } - // if not we check previous tasks - // until here this task has not appdelegations records. - // get all previous task from $taskUid, and return open delegations rows, if there are + //Search the open delegations in the previous task, this is a recursive review + $threads = $this->getReviewedTasksRecursive($taskUid, $appUid, $previousTasks); + return $threads; + } + /** + * This function get the last open task + * Usually is used when we have a SEC-JOIN and need to review if we need to route the case + * @param string $taskUid + * @param string $appUid + * @param array $previousTasks + * @return array $taskReviewed + */ + public function getReviewedTasksRecursive($taskUid, $appUid, $previousTasks) { + $taskReviewed = array(); $oCriteria = new Criteria('workflow'); $oCriteria->add(RoutePeer::ROU_NEXT_TASK, $taskUid); $oDataset = RoutePeer::doSelectRs($oCriteria); @@ -1422,33 +1431,27 @@ class Cases while ($oDataset->next()) { $aRow = $oDataset->getRow(); - - $delegations = $this->getReviewedTasks($aRow['TAS_UID'], $sAppUid); + $delegations = $this->getReviewedTasks($aRow['TAS_UID'], $appUid); if ($delegations !== false) { if (count($delegations['open']) > 0) { //there is an open delegation, so we need to return the delegation row - $aTaskReviewed = array_merge($aTaskReviewed, $delegations['open']); - } else { - if ($aRow['ROU_TYPE'] == 'PARALLEL-BY-EVALUATION') { - $aTaskReviewed = array(); - } else { - //$aTaskReviewed = array_merge($aTaskReviewed, $delegations['closed']); - } + $taskReviewed = array_merge($taskReviewed, $delegations['open']); + } elseif ($aRow['ROU_TYPE'] == 'PARALLEL-BY-EVALUATION') { + $taskReviewed = array(); } - } else { - if (!in_array($aRow['TAS_UID'], $aPreviousTasks)) { - // storing the current task uid of the task currently checked - $aPreviousTasks[] = $aRow['TAS_UID']; - // passing the array of previous tasks in oprder to avoid an infinite loop that prevents - $openPreviousTask = $this->searchOpenPreviousTasks($aRow['TAS_UID'], $sAppUid, $aPreviousTasks); - if (count($aPreviousTasks) > 0) { - $aTaskReviewed = array_merge($aTaskReviewed, $openPreviousTask); - } + } elseif (!in_array($aRow['TAS_UID'], $previousTasks)) { + //Storing the current task uid of the task currently checked + $previousTasks[] = $aRow['TAS_UID']; + //Passing the array of previous tasks in order to avoid an infinite loop that prevents + $openPreviousTask = $this->searchOpenPreviousTasks($aRow['TAS_UID'], $appUid, $previousTasks); + if (count($previousTasks) > 0) { + $taskReviewed = array_merge($taskReviewed, $openPreviousTask); } } } - return $aTaskReviewed; + + return $taskReviewed; } /** @@ -5788,8 +5791,8 @@ class Cases * @param string $tasUid * @param string $usrUid * @param string $action some action [VIEW, BLOCK, RESEND] - * @param string $delIndex - * @return Array within all user permitions all objects' types + * @param integer $delIndex + * @return array within all user permissions all objects' types */ public function getAllObjectsFrom($proUid, $appUid, $tasUid = '', $usrUid = '', $action = '', $delIndex = 0) { @@ -5808,6 +5811,7 @@ class Cases $result = array( "DYNAFORM" => array(), "INPUT" => array(), + "ATTACHMENT" => array(), "OUTPUT" => array(), "CASES_NOTES" => 0, "MSGS_HISTORY" => array() @@ -5878,6 +5882,15 @@ class Cases $opObjUid, $aCase['APP_STATUS'] ); + //For Attachment + $result['ATTACHMENT'] = $oObjectPermission->objectPermissionByOutputInput( + $appUid, + $proUid, + $opTaskSource, + 'ATTACHED', + $opObjUid, + $aCase['APP_STATUS'] + ); $result['CASES_NOTES'] = 1; /*----------------------------------********---------------------------------*/ @@ -5914,6 +5927,16 @@ class Cases $aCase['APP_STATUS'] ); break; + case 'ATTACHMENT': + $result['ATTACHMENT'] = $oObjectPermission->objectPermissionByOutputInput( + $appUid, + $proUid, + $opTaskSource, + 'ATTACHED', + $opObjUid, + $aCase['APP_STATUS'] + ); + break; case 'OUTPUT': $result['OUTPUT'] = $oObjectPermission->objectPermissionByOutputInput( $appUid, @@ -5948,9 +5971,10 @@ class Cases } } - return Array( + return array( "DYNAFORMS" => $result['DYNAFORM'], "INPUT_DOCUMENTS" => $result['INPUT'], + "ATTACHMENTS" => $result['ATTACHMENT'], "OUTPUT_DOCUMENTS" => $result['OUTPUT'], "CASES_NOTES" => $result['CASES_NOTES'], "MSGS_HISTORY" => $result['MSGS_HISTORY'] diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index d2cb27e00..9dbd41bcc 100644 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -1,40 +1,4 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - * - */ -require_once ("classes/model/Task.php"); -require_once ("classes/model/Process.php"); -require_once ("classes/model/Step.php"); -require_once ("classes/model/Application.php"); -require_once ('classes/model/Groupwf.php'); -require_once ("classes/model/GroupUser.php"); -require_once ("classes/model/AppDelegation.php"); -require_once ("classes/model/Route.php"); -require_once ('classes/model/SubApplication.php'); -require_once ('classes/model/SubProcess.php'); -require_once ("classes/model/Users.php"); /** * derivation - derivation class @@ -87,6 +51,7 @@ class Derivation * @param array $arrayTaskData Task data (derivation) * * @return array Return array + * @throws Exception */ protected function prepareInformationTask(array $arrayTaskData) { @@ -161,7 +126,8 @@ class Derivation * @param array $arrayData Data * @param string $taskUid Unique id of Task * - * @return array Return array + * @return array + * @throws Exception */ public function prepareInformation(array $arrayData, $taskUid = "") { diff --git a/workflow/engine/classes/model/AppDocument.php b/workflow/engine/classes/model/AppDocument.php index 7e9eb6075..b9f9ece1a 100644 --- a/workflow/engine/classes/model/AppDocument.php +++ b/workflow/engine/classes/model/AppDocument.php @@ -530,10 +530,16 @@ class AppDocument extends BaseAppDocument return $documents; } - public function exists ($sAppDocUid, $iVersion) + /** + * This function check if exist a document + * @param string $appDocUid, Uid of the document + * @param integer $version, + * @return object + */ + public function exists ($appDocUid, $version = 1) { - $oAppDocument = AppDocumentPeer::retrieveByPK( $sAppDocUid, $iVersion ); - return (is_object( $oAppDocument ) && get_class( $oAppDocument ) == 'AppDocument'); + $oAppDocument = AppDocumentPeer::retrieveByPK($appDocUid, $version); + return (is_object($oAppDocument) && get_class($oAppDocument) == 'AppDocument'); } /** @@ -547,6 +553,7 @@ class AppDocument extends BaseAppDocument */ public function canDownloadInput($user, $appDocUid, $version) { + //Check if the the requester is the owner in the file $oCriteria = new Criteria('workflow'); $oCriteria->addSelectColumn(AppDocumentPeer::APP_UID); $oCriteria->addJoin(AppDocumentPeer::DOC_UID, InputDocumentPeer::INP_DOC_UID, Criteria::LEFT_JOIN); @@ -560,11 +567,11 @@ class AppDocument extends BaseAppDocument if ($dataset->getRow()) { return true; } else { + //Review if is a INPUT or ATTACHED $oCriteria = new Criteria("workflow"); $oCriteria->addSelectColumn(AppDocumentPeer::APP_UID); $oCriteria->addSelectColumn(AppDocumentPeer::DOC_UID); - $oCriteria->addSelectColumn(InputDocumentPeer::PRO_UID); - $oCriteria->addJoin(AppDocumentPeer::DOC_UID, InputDocumentPeer::INP_DOC_UID, Criteria::LEFT_JOIN); + $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_TYPE); $oCriteria->add(AppDocumentPeer::APP_DOC_UID, $appDocUid); $oCriteria->add(AppDocumentPeer::DOC_VERSION, $version); $oCriteria->setLimit(1); @@ -572,28 +579,56 @@ class AppDocument extends BaseAppDocument $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $dataset->next(); $row = $dataset->getRow(); - $cases = new \ProcessMaker\BusinessModel\Cases(); - $userAuthorization = $cases->userAuthorization( - $user, - $row['PRO_UID'], - $row['APP_UID'], - array(), - array('INPUT_DOCUMENTS' => 'VIEW') - ); - - if (in_array($appDocUid, $userAuthorization['objectPermissions']['INPUT_DOCUMENTS'])) { - return true; - } - - if ($userAuthorization['supervisor']) { - $criteria = new Criteria("workflow"); - $criteria->addSelectColumn(StepSupervisorPeer::STEP_UID); - $criteria->add(StepSupervisorPeer::STEP_TYPE_OBJ, "INPUT_DOCUMENT", \Criteria::EQUAL); - $criteria->add(StepSupervisorPeer::STEP_UID_OBJ, $row['DOC_UID'], \Criteria::EQUAL); - $rsCriteria = StepSupervisorPeer::doSelectRS($criteria); - if ($rsCriteria->next()) { + if ($row['DOC_UID'] == '-1') { + //If is an attached we only verify if is a supervisor in the process + $appUid = $row['APP_UID']; + $oApplication = new Application(); + $aColumns = $oApplication->Load($appUid); + $cases = new \ProcessMaker\BusinessModel\Cases(); + $userAuthorization = $cases->userAuthorization( + $user, + $aColumns['PRO_UID'], + $appUid, + array(), + array('ATTACHMENTS' => 'VIEW') + ); + //Has permissions? + if (in_array($appDocUid, $userAuthorization['objectPermissions']['ATTACHMENTS'])) { return true; } + //Is supervisor? + if ($userAuthorization['supervisor']) { + return true; + } + } else { + //If is an file related an input document, we will check if the user is a supervisor or has permissions + $appUid = $row['APP_UID']; + $oInputDoc = new InputDocument(); + $aColumns = $oInputDoc->Load($row['DOC_UID']); + $cases = new \ProcessMaker\BusinessModel\Cases(); + $userAuthorization = $cases->userAuthorization( + $user, + $aColumns['PRO_UID'], + $appUid, + array(), + array('INPUT_DOCUMENTS' => 'VIEW') + ); + //Has permissions? + if (in_array($appDocUid, $userAuthorization['objectPermissions']['INPUT_DOCUMENTS'])) { + return true; + } + //Is supervisor? + if ($userAuthorization['supervisor']) { + //Review if the supervisor has assigned the object input document + $criteria = new Criteria("workflow"); + $criteria->addSelectColumn(StepSupervisorPeer::STEP_UID); + $criteria->add(StepSupervisorPeer::STEP_TYPE_OBJ, "INPUT_DOCUMENT", \Criteria::EQUAL); + $criteria->add(StepSupervisorPeer::STEP_UID_OBJ, $row['DOC_UID'], \Criteria::EQUAL); + $rsCriteria = StepSupervisorPeer::doSelectRS($criteria); + if ($rsCriteria->next()) { + return true; + } + } } } return false; diff --git a/workflow/engine/classes/model/ObjectPermission.php b/workflow/engine/classes/model/ObjectPermission.php index f50a77b04..04af9b9fe 100644 --- a/workflow/engine/classes/model/ObjectPermission.php +++ b/workflow/engine/classes/model/ObjectPermission.php @@ -383,10 +383,10 @@ class ObjectPermission extends BaseObjectPermission } switch ($obType) { case 'INPUT': - $oCriteria->add( - $oCriteria->getNewCriterion(AppDocumentPeer::APP_DOC_TYPE, 'INPUT')-> - addOr($oCriteria->getNewCriterion(AppDocumentPeer::APP_DOC_TYPE, 'ATTACHED')) - ); + $oCriteria->add(AppDocumentPeer::APP_DOC_TYPE, 'INPUT'); + break; + case 'ATTACHED': + $oCriteria->add(AppDocumentPeer::APP_DOC_TYPE, 'ATTACHED'); break; case 'OUTPUT': $oCriteria->add(AppDocumentPeer::APP_DOC_TYPE, 'OUTPUT'); @@ -399,9 +399,6 @@ class ObjectPermission extends BaseObjectPermission $result = array(); while ($oDataset->next()) { $aRow = $oDataset->getRow(); - if ($aRow['APP_DOC_TYPE'] == "ATTACHED") { - $aRow['APP_DOC_TYPE'] = "INPUT"; - } if (!in_array($aRow['APP_DOC_UID'], $result)) { array_push($result, $aRow['APP_DOC_UID']); } diff --git a/workflow/engine/classes/model/map/EmailEventMapBuilder.php b/workflow/engine/classes/model/map/EmailEventMapBuilder.php index 1553782ae..70c4433c3 100644 --- a/workflow/engine/classes/model/map/EmailEventMapBuilder.php +++ b/workflow/engine/classes/model/map/EmailEventMapBuilder.php @@ -75,7 +75,7 @@ class EmailEventMapBuilder $tMap->addColumn('EMAIL_EVENT_TO', 'EmailEventTo', 'string', CreoleTypes::LONGVARCHAR, true, null); - $tMap->addColumn('EMAIL_EVENT_SUBJECT', 'EmailEventSubject', 'string', CreoleTypes::VARCHAR, false, 150); + $tMap->addColumn('EMAIL_EVENT_SUBJECT', 'EmailEventSubject', 'string', CreoleTypes::VARCHAR, false, 255); $tMap->addColumn('PRF_UID', 'PrfUid', 'string', CreoleTypes::VARCHAR, false, 32); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 107dcce24..8fde24211 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5537,7 +5537,7 @@ - + diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index bc88ba754..258f0b0d9 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -9326,6 +9326,12 @@ msgstr "Web Entry deleted correctly" msgid "[LABEL/ID_PASSWORD] Password" msgstr "Password" +# TRANSLATION +# LABEL/ID_PASSWORD_CONFIRM +#: LABEL/ID_PASSWORD_CONFIRM +msgid "[LABEL/ID_PASSWORD_CONFIRM] Confirm Password" +msgstr "Confirm Password" + # TRANSLATION # LABEL/ID_NOT_DEFINED #: LABEL/ID_NOT_DEFINED diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php index 089582cdc..d4cfa409b 100644 --- a/workflow/engine/controllers/designer.php +++ b/workflow/engine/controllers/designer.php @@ -7,11 +7,16 @@ * @access public */ +use Maveriks\Util\ClassLoader; +use \OAuth2\Request; +use \ProcessMaker\BusinessModel\Light\Tracker; +use \ProcessMaker\Services\OAuth2\Server; + class Designer extends Controller { protected $clientId = 'x-pm-local-client'; - public function __construct () + public function __construct() { } @@ -26,57 +31,16 @@ class Designer extends Controller $proUid = isset($httpData->prj_uid) ? $httpData->prj_uid : ''; $appUid = isset($httpData->app_uid) ? $httpData->app_uid : ''; $proReadOnly = isset($httpData->prj_readonly) ? $httpData->prj_readonly : 'false'; - $client = $this->getClientCredentials(); - if (isset($httpData->tracker_designer) && $httpData->tracker_designer == 1) { - try { - if (!isset($_SESSION['CASE']) && !isset($_SESSION['PIN'])) { - throw (new \Exception( - \G::LoadTranslation('ID_CASE_NOT_EXISTS') . "\n" . \G::LoadTranslation('ID_PIN_INVALID') - )); - } - \ProcessMaker\BusinessModel\Light\Tracker::authentication($_SESSION['CASE'], $_SESSION['PIN']); - } catch (\Exception $e) { - Bootstrap::registerMonolog('CaseTracker', 400, $e->getMessage(), [], SYS_SYS, 'processmaker.log'); - \G::header('Location: /errors/error403.php'); - die(); - } - $client["tracker_designer"] = 1; - } - - $authCode = $this->getAuthorizationCode($client); + $clientToken = $this->getCredentials($httpData); $debug = false; //System::isDebugMode(); - $loader = Maveriks\Util\ClassLoader::getInstance(); - $loader->add(PATH_TRUNK . 'vendor/bshaffer/oauth2-server-php/src/', "OAuth2"); - - $request = array( - 'grant_type' => 'authorization_code', - 'code' => $authCode - ); - $server = array( - 'REQUEST_METHOD' => 'POST' - ); - $headers = array( - "PHP_AUTH_USER" => $client['CLIENT_ID'], - "PHP_AUTH_PW" => $client['CLIENT_SECRET'], - "Content-Type" => "multipart/form-data;", - "Authorization" => "Basic " . base64_encode($client['CLIENT_ID'] . ":" . $client['CLIENT_SECRET']) - ); - - $request = new \OAuth2\Request(array(), $request, array(), array(), array(), $server, null, $headers); - $oauthServer = new \ProcessMaker\Services\OAuth2\Server(); - $response = $oauthServer->postToken($request, true); - $clientToken = $response->getParameters(); - $clientToken["client_id"] = $client['CLIENT_ID']; - $clientToken["client_secret"] = $client['CLIENT_SECRET']; - $consolidated = 0; $enterprise = 0; $distribution = 0; /*----------------------------------********---------------------------------*/ - $licensedFeatures = & PMLicensedFeatures::getSingleton(); + $licensedFeatures = &PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7TTeDBQeWRoZTZKYjh4eFpYUlRDUUEyVERPU3FxellWank=')) { $consolidated = 1; } @@ -101,10 +65,10 @@ class Designer extends Controller $this->setVar('HTTP_SERVER_HOSTNAME', PmSystem::getHttpServerHostnameRequestsFrontEnd()); if ($debug) { - if (! file_exists(PATH_HTML . "lib-dev/pmUI/build.cache")) { + if (!file_exists(PATH_HTML . "lib-dev/pmUI/build.cache")) { throw new RuntimeException("Development JS Files were are not generated!.\nPlease execute: \$>rake pmBuildDebug in pmUI project"); } - if (! file_exists(PATH_HTML . "lib-dev/mafe/build.cache")) { + if (!file_exists(PATH_HTML . "lib-dev/mafe/build.cache")) { throw new RuntimeException("Development JS Files were are not generated!.\nPlease execute: \$>rake pmBuildDebug in MichelangeloFE project"); } @@ -128,7 +92,7 @@ class Designer extends Controller $this->setVar('mafeCssFiles', $mafeCssFiles); } else { $buildhashFile = PATH_HTML . "lib/buildhash"; - if (! file_exists($buildhashFile)) { + if (!file_exists($buildhashFile)) { throw new RuntimeException("CSS and JS Files were are not generated!.\nPlease review install process"); } $buildhash = file_get_contents($buildhashFile); @@ -137,7 +101,7 @@ class Designer extends Controller $translationMafe = "/translations/translationsMafe.js"; $this->setVar('translationMafe', $translationMafe); - if (!file_exists(PATH_HTML . "translations" . PATH_SEP. 'translationsMafe' . ".js")) { + if (!file_exists(PATH_HTML . "translations" . PATH_SEP . 'translationsMafe' . ".js")) { $translation = new Translation(); $translation->generateFileTranslationMafe(); } @@ -197,10 +161,10 @@ class Designer extends Controller protected function getAuthorizationCode($client) { - \ProcessMaker\Services\OAuth2\Server::setDatabaseSource($this->getDsn()); - \ProcessMaker\Services\OAuth2\Server::setPmClientId($client['CLIENT_ID']); + Server::setDatabaseSource($this->getDsn()); + Server::setPmClientId($client['CLIENT_ID']); - $oauthServer = new \ProcessMaker\Services\OAuth2\Server(); + $oauthServer = new Server(); if (isset($client["tracker_designer"]) && $client["tracker_designer"] == 1) { $_SESSION["USER_LOGGED"] = "00000000000000000000000000000001"; @@ -215,7 +179,7 @@ class Designer extends Controller )); $response = $oauthServer->postAuthorize($authorize, $userId, true); - $code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=')+5, 40); + $code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=') + 5, 40); if (isset($client["tracker_designer"]) && $client["tracker_designer"] == 1) { unset($_SESSION["USER_LOGGED"]); @@ -228,8 +192,63 @@ class Designer extends Controller { list($host, $port) = strpos(DB_HOST, ':') !== false ? explode(':', DB_HOST) : array(DB_HOST, ''); $port = empty($port) ? '' : ";port=$port"; - $dsn = DB_ADAPTER.':host='.$host.';dbname='.DB_NAME.$port; + $dsn = DB_ADAPTER . ':host=' . $host . ';dbname=' . DB_NAME . $port; return array('dsn' => $dsn, 'username' => DB_USER, 'password' => DB_PASS); } + + /** + * Return credentials oauth2 + * + * @param object $httpData + * @return array credentials + */ + public function getCredentials($httpData = null) + { + $client = $this->getClientCredentials(); + + if (!empty($httpData->tracker_designer) && $httpData->tracker_designer == 1) { + try { + if (!isset($_SESSION['CASE']) && !isset($_SESSION['PIN'])) { + throw (new \Exception( + \G::LoadTranslation('ID_CASE_NOT_EXISTS') . "\n" . \G::LoadTranslation('ID_PIN_INVALID') + )); + } + Tracker::authentication($_SESSION['CASE'], $_SESSION['PIN']); + } catch (\Exception $e) { + Bootstrap::registerMonolog('CaseTracker', 400, $e->getMessage(), [], SYS_SYS, 'processmaker.log'); + \G::header('Location: /errors/error403.php'); + die(); + } + $client["tracker_designer"] = 1; + } + + $authCode = $this->getAuthorizationCode($client); + + $loader = ClassLoader::getInstance(); + $loader->add(PATH_TRUNK . 'vendor/bshaffer/oauth2-server-php/src/', "OAuth2"); + + $request = array( + 'grant_type' => 'authorization_code', + 'code' => $authCode + ); + $server = array( + 'REQUEST_METHOD' => 'POST' + ); + $headers = array( + "PHP_AUTH_USER" => $client['CLIENT_ID'], + "PHP_AUTH_PW" => $client['CLIENT_SECRET'], + "Content-Type" => "multipart/form-data;", + "Authorization" => "Basic " . base64_encode($client['CLIENT_ID'] . ":" . $client['CLIENT_SECRET']) + ); + + $request = new Request(array(), $request, array(), array(), array(), $server, null, $headers); + $oauthServer = new Server(); + $response = $oauthServer->postToken($request, true); + $clientToken = $response->getParameters(); + $clientToken["client_id"] = $client['CLIENT_ID']; + $clientToken["client_secret"] = $client['CLIENT_SECRET']; + + return $clientToken; + } } diff --git a/workflow/engine/controllers/installer.php b/workflow/engine/controllers/installer.php index fa3a896d1..64513a7b6 100644 --- a/workflow/engine/controllers/installer.php +++ b/workflow/engine/controllers/installer.php @@ -80,36 +80,42 @@ class Installer extends Controller G::RenderPage( 'publish', 'extJs' ); } + /** + * This function can be create a new workspace + * The user need permission PM_SETUP_ADVANCE for this action + * @return void + */ public function newSite () { - $textStep1 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP4_1'); - $textStep2 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP5'); + if (!$this->pmIsInstalled()) { + $textStep1 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP4_1'); + $textStep2 = G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_DESCRIPTION_STEP5'); - $this->includeExtJS( 'installer/CardLayout', false ); - $this->includeExtJS( 'installer/Wizard', false ); - $this->includeExtJS( 'installer/Header', false ); - $this->includeExtJS( 'installer/Card', false ); - $this->includeExtJS( 'installer/newSite', false ); + $this->includeExtJS('installer/CardLayout', false); + $this->includeExtJS('installer/Wizard', false); + $this->includeExtJS('installer/Header', false); + $this->includeExtJS('installer/Card', false); + $this->includeExtJS('installer/newSite', false); + $this->setJSVar('textStep1', $textStep1); + $this->setJSVar('textStep2', $textStep2); + $this->setJSVar('DB_ADAPTER', DB_ADAPTER); + $aux = explode(':', DB_HOST); + $this->setJSVar('DB_HOST', $aux[0]); + $this->setJSVar('DB_PORT', isset( $aux[1] ) ? $aux[1] : (DB_ADAPTER == 'mssql' ? '1433' : '3306')); + $this->setJSVar('DB_NAME', 'workflow'); + $this->setJSVar('DB_USER', ''); + $this->setJSVar('DB_PASS', ''); + $this->setJSVar('pathConfig', PATH_CORE . 'config' . PATH_SEP); + $this->setJSVar('pathLanguages', PATH_LANGUAGECONT); + $this->setJSVar('pathPlugins', PATH_PLUGINS); + $this->setJSVar('pathXmlforms', PATH_XMLFORM); + $this->setJSVar('pathShared', PATH_DATA); + $this->setView('installer/newSite'); - $this->setJSVar( 'textStep1', $textStep1 ); - $this->setJSVar( 'textStep2', $textStep2 ); - - $this->setJSVar( 'DB_ADAPTER', DB_ADAPTER ); - $aux = explode( ':', DB_HOST ); - $this->setJSVar( 'DB_HOST', $aux[0] ); - $this->setJSVar( 'DB_PORT', isset( $aux[1] ) ? $aux[1] : (DB_ADAPTER == 'mssql' ? '1433' : '3306') ); - $this->setJSVar( 'DB_NAME', 'workflow' ); - $this->setJSVar( 'DB_USER', '' ); - $this->setJSVar( 'DB_PASS', '' ); - $this->setJSVar( 'pathConfig', PATH_CORE . 'config' . PATH_SEP ); - $this->setJSVar( 'pathLanguages', PATH_LANGUAGECONT ); - $this->setJSVar( 'pathPlugins', PATH_PLUGINS ); - $this->setJSVar( 'pathXmlforms', PATH_XMLFORM ); - $this->setJSVar( 'pathShared', PATH_DATA ); - - $this->setView( 'installer/newSite' ); - - G::RenderPage( 'publish', 'extJs' ); + G::RenderPage('publish', 'extJs'); + } else { + $this->displayError(); + } } public function getSystemInfo () @@ -414,22 +420,49 @@ class Installer extends Controller /** * function to create a workspace * in fact this function is calling appropiate functions for mysql and mssql + * need permission PM_SETUP_ADVANCE for this action + * @return void */ public function createWorkspace () { - $pathSharedPartner = trim( $_REQUEST['pathShared'] ); - if (file_exists(trim($pathSharedPartner,PATH_SEP). PATH_SEP .'partner.info')) { - $this->systemName = $this->getSystemName($pathSharedPartner); - $_REQUEST["PARTNER_FLAG"] = true; - } - $this->setResponseType( 'json' ); - if ($_REQUEST['db_engine'] == 'mysql') { - $info = $this->createMySQLWorkspace(); - } else { - $info = $this->createMSSQLWorkspace(); - } + if (!$this->pmIsInstalled()) { + $pathSharedPartner = trim($_REQUEST['pathShared']); + if (file_exists(trim($pathSharedPartner, PATH_SEP) . PATH_SEP . 'partner.info')) { + $this->systemName = $this->getSystemName($pathSharedPartner); + $_REQUEST["PARTNER_FLAG"] = true; + } + $this->setResponseType('json'); + if ($_REQUEST['db_engine'] == 'mysql') { + $info = $this->createMySQLWorkspace(); + } else { + $info = $this->createMSSQLWorkspace(); + } - return $info; + return $info; + } else { + $this->displayError(); + } + } + + /** + * We check if processMaker is not installed + * + * @return boolean + */ + private function pmIsInstalled(){ + return file_exists(FILE_PATHS_INSTALLED); + } + + /** + * Display an error when processMaker is already installed + * + * @return void + */ + private function displayError(){ + $this->setJSVar('messageError', G::LoadTranslation('ID_PROCESSMAKER_ALREADY_INSTALLED')); + $this->includeExtJS('installer/stopInstall'); + $this->setView('installer/mainStopInstall'); + G::RenderPage('publish', 'extJs'); } public function forceTogenerateTranslationsFiles ($url) diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 7354b4f58..8bcd5a6e7 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -3025,6 +3025,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_CONFIRM_DELETE_WEB_ENTRY','en','Do you want to delete current web entry?','2014-01-15') , ( 'LABEL','ID_WEB_ENTRY_SUCCESS_DELETE','en','Web Entry deleted correctly','2014-01-15') , ( 'LABEL','ID_PASSWORD','en','Password','2014-01-15') , +( 'LABEL','ID_PASSWORD_CONFIRM','en','Confirm Password','2017-07-25') , ( 'LABEL','ID_NOT_DEFINED','en','Not defined','2014-01-15') , ( 'LABEL','ID_WEB_ENTRY_SUCCESS_NEW','en','Web Entry has been created correctly.','2014-01-15') , ( 'LABEL','ID_REMOVE_ALL_BUTTON_FACE','en','<<','2014-01-15') , diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 39d14e01d..0c0898e37 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -3068,7 +3068,7 @@ CREATE TABLE `EMAIL_EVENT` `EVN_UID` VARCHAR(32) NOT NULL, `EMAIL_EVENT_FROM` VARCHAR(100) default '' NOT NULL, `EMAIL_EVENT_TO` MEDIUMTEXT NOT NULL, - `EMAIL_EVENT_SUBJECT` VARCHAR(150) default '', + `EMAIL_EVENT_SUBJECT` VARCHAR(255) default '', `PRF_UID` VARCHAR(32) default '', `EMAIL_SERVER_UID` VARCHAR(32) default '', PRIMARY KEY (`EMAIL_EVENT_UID`) diff --git a/workflow/engine/methods/install/newSite.php b/workflow/engine/methods/install/newSite.php index 2ff893fc8..03f4f65a1 100644 --- a/workflow/engine/methods/install/newSite.php +++ b/workflow/engine/methods/install/newSite.php @@ -1,26 +1,7 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ + +global $RBAC; +$RBAC->allows(basename(__FILE__), basename(__FILE__)); if (isset( $_POST['form']['NW_TITLE'] )) { $action = (isset( $_POST['form']['ACTION'] )) ? trim( $_POST['form']['ACTION'] ) : 'test'; diff --git a/workflow/engine/methods/processes/mainInit.php b/workflow/engine/methods/processes/mainInit.php index 64a525ac9..fc8534961 100644 --- a/workflow/engine/methods/processes/mainInit.php +++ b/workflow/engine/methods/processes/mainInit.php @@ -88,6 +88,13 @@ $oHeadPublisher->assign("arrayMenuNewOptionPlugin", $arrayMenuNewOptionPlugin); $oHeadPublisher->assign("arrayContextMenuOptionPlugin", $arrayContextMenuOptionPlugin); $oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState()); +$designer = new Designer(); +$oHeadPublisher->assign('SYS_SYS', SYS_SYS); +$oHeadPublisher->assign('SYS_LANG', SYS_LANG); +$oHeadPublisher->assign('SYS_SKIN', SYS_SKIN); +$oHeadPublisher->assign('HTTP_SERVER_HOSTNAME', PmSystem::getHttpServerHostnameRequestsFrontEnd()); +$oHeadPublisher->assign('credentials', base64_encode(G::json_encode($designer->getCredentials()))); + $deleteCasesFlag = false; global $RBAC; if($RBAC->userCanAccess('PM_DELETE_PROCESS_CASES') === 1) { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php index a5de78aa1..0a61b4eb4 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php @@ -1,6 +1,7 @@ - * @copyright Colosa - Bolivia * * @return void + * @throws Exception */ - - public function saveProcessPermission($data, $op_uid = '') + public function saveProcessPermission($data, $opUid = '') { try { $data = array_change_key_case($data, CASE_UPPER); $this->validateProUid($data['PRO_UID']); - if ($op_uid != '') { - $op_uid = $this->validateOpUid($op_uid); + if ($opUid != '') { + $opUid = $this->validateOpUid($opUid); } if ($data['OP_USER_RELATION'] == "1") { $this->validateUsrUid($data['USR_UID']); @@ -257,6 +256,9 @@ class ProcessPermissions } $sObjectUID = $data['DYNAFORMS']; break; + case 'ATTACHED': + $sObjectUID = ''; + break; case 'INPUT': $data['INPUTS'] = $data['INPUTS'] == 0 ? '': $data['INPUTS']; if ($data['INPUTS'] != '') { @@ -273,11 +275,11 @@ class ProcessPermissions break; } $oOP = new \ObjectPermission(); - $permissionUid = ($op_uid != '') ? $op_uid : G::generateUniqueID(); + $permissionUid = ($opUid != '') ? $opUid : G::generateUniqueID(); $data['OP_UID'] = $permissionUid; $data['OP_OBJ_UID'] = $sObjectUID; - if ($op_uid == '') { + if ($opUid == '') { $oOP->fromArray( $data, \BasePeer::TYPE_FIELDNAME ); $oOP->save(); $daraRes = $oOP->load($permissionUid); diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php index e73247e51..974f18116 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessPermissions.php @@ -65,7 +65,7 @@ class ProcessPermissions extends Api * @param string $op_user_relation {@from body} {@choice 1,2} * @param string $op_case_status {@from body} {@choice ALL,DRAFT,TO_DO,PAUSED,COMPLETED} * @param string $op_participate {@from body} {@choice 0,1} - * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM} + * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,ATTACHMENT,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM} * @param string $op_action {@from body} {@choice VIEW,BLOCK,DELETE,RESEND} * @param string $tas_uid {@from body} * @param string $op_task_source {@from body} @@ -123,7 +123,7 @@ class ProcessPermissions extends Api * @param string $op_user_relation {@from body} {@choice 1,2} * @param string $op_case_status {@from body} {@choice ALL,DRAFT,TO_DO,PAUSED,COMPLETED} * @param string $op_participate {@from body} {@choice 0,1} - * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM} + * @param string $op_obj_type {@from body} {@choice ANY,DYNAFORM,ATTACHMENT,INPUT,OUTPUT,CASES_NOTES,MSGS_HISTORY,SUMMARY_FORM} * @param string $op_action {@from body} {@choice VIEW,BLOCK,DELETE,RESEND} * @param string $tas_uid {@from body} * @param string $op_task_source {@from body}