diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index a96b5977a..69feae7d6 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -463,10 +463,17 @@ class G * @return void */ public static function LoadSystem ($strClass) - { require_once (PATH_GULLIVER . 'class.inputfilter.php'); - $filter = new InputFilter(); + { $path = PATH_GULLIVER . 'class.' . $strClass . '.php'; - $path = $filter->validateInput($path, 'path'); + if(file_exists(PATH_GULLIVER . 'class.inputfilter.php')) { + require_once (PATH_GULLIVER . 'class.inputfilter.php'); + $filter = new InputFilter(); + $path = $filter->validateInput($path, 'path'); + } else { + if(!file_exists($path)) { + $path = ''; + } + } require_once ($path); } @@ -2656,6 +2663,7 @@ class G $path = $filter->validateInput($path, "path"); move_uploaded_file( $file, $path . "/" . $nameToSave ); + $nameToSave = $filter->validateInput($nameToSave, "path"); @chmod( $path . "/" . $nameToSave, $permission ); umask( $oldumask ); diff --git a/gulliver/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php b/gulliver/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php index ae87e5462..41dbdf521 100755 --- a/gulliver/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php +++ b/gulliver/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php @@ -634,15 +634,29 @@ $dir = dirname($path)."/"; $base = basename($path); + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + foreach($options["props"] as $key => $prop) { if ($prop["ns"] == "DAV:") { $options["props"][$key]['status'] = "403 Forbidden"; } else { if (isset($prop["val"])) { - $query = "REPLACE INTO properties SET path = '$options[path]', name = '$prop[name]', ns= '$prop[ns]', value = '$prop[val]'"; + $query = "REPLACE INTO properties SET path = '%s', name = '%s', ns= '%s', value = '%s'"; + $query = $filter->preventSqlInjection($query, Array($options['path'],$prop['name'],$prop['ns'],$prop['val'])); error_log($query); } else { - $query = "DELETE FROM properties WHERE path = '$options[path]' AND name = '$prop[name]' AND ns = '$prop[ns]'"; + $query = "DELETE FROM properties WHERE path = '%s' AND name = '%s' AND ns = '%s'"; + $query = $filter->preventSqlInjection($query, Array($options['path'],$prop['name'],$prop['ns'])); } mysql_query($query); } diff --git a/gulliver/thirdparty/phpmailer/class.smtp.php b/gulliver/thirdparty/phpmailer/class.smtp.php index 3d4b9ce00..45abc8694 100755 --- a/gulliver/thirdparty/phpmailer/class.smtp.php +++ b/gulliver/thirdparty/phpmailer/class.smtp.php @@ -305,7 +305,7 @@ class SMTP { break; case 'LOGIN': // Start authentication - fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + @fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); $rply = $this->get_lines(); $code = substr($rply,0,3); diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index c64c1ab15..99e9e4479 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -949,6 +949,10 @@ class Cases public function updateCase($sAppUid, $Fields = array()) { try { + $oApplication = new Application; + if (!$oApplication->exists($sAppUid)) { + return false; + } $aApplicationFields = $Fields['APP_DATA']; $Fields['APP_UID'] = $sAppUid; $Fields['APP_UPDATE_DATE'] = 'now'; @@ -6740,7 +6744,7 @@ class Cases $rows[] = $rs->getRow(); } - if ($PRO_UID != null) { + if ($PRO_UID != null) { //Add supervisor // Users $oCriteria = new Criteria('workflow'); @@ -6760,8 +6764,10 @@ class Cases $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $flagSupervisors = false; - if ($oDataset->next()) { - $rows[] = $oDataset->getRow(); + if ($oDataset->next()) { + if (!in_array($USR_UID,$row)) { + $rows[] = $oDataset->getRow(); + } $flagSupervisors = true; } @@ -6789,10 +6795,13 @@ class Cases $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); if ($oDataset->next()) { - $rows[] = $oDataset->getRow(); + if (!in_array($USR_UID,$row)) { + $rows[] = $oDataset->getRow(); + } } } } + return $rows; } @@ -6898,7 +6907,7 @@ class Cases unset($aFields['APP_STATUS']); unset($aFields['APP_PROC_STATUS']); unset($aFields['APP_PROC_CODE']); - unset($aFields['APP_PIN']); + unset($aFields['APP_PIN']); $this->updateCase($aFields['APP_UID'], $aFields); return true; } diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 8bcfea764..555e04870 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -2097,7 +2097,7 @@ function PMFAssignUserToGroup ($userId, $groupId) * @label PMF Create User * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFCreateUser.28.29 * - * @param string(32) | $userId | User ID | The username for the new user. + * @param string(32) | $userId | User Name | The username for the new user. * @param string(32) | $password | Password of the new user | The password of the new user, which can be up to 32 characters long. * @param string(32) | $firstname | Firstname of the new user | The first name of the user, which can be up to 50 characters long. * @param string(32) | $lastname | Lastname of the new user | The last name of the user, which can be up to 50 characters long. @@ -2865,8 +2865,9 @@ function PMFRemoveMask ($field, $separator = '.', $currency = '') $field = str_replace($thousandSeparator, "", $field); $field = str_replace($decimalSeparator, ".", $field); $field = str_replace($currency, "", $field); - $field = floatval(trim($field)); - + if(strpos($decimalSeparator, $field) !== false){ + $field = (float)(trim($field)); + } return $field; } @@ -2881,17 +2882,17 @@ function PMFRemoveMask ($field, $separator = '.', $currency = '') * @return int | $result | Result of send variables | Returns 1 if the variables were sent successfully to the case; otherwise, returns 0 if an error occurred. * */ - + function PMFSaveCurrentData () { global $oPMScript; $result = 0; - + if (isset($_SESSION['APPLICATION']) && isset($oPMScript->aFields)) { G::LoadClass( 'wsBase' ); $ws = new wsBase(); $result = $ws->sendVariables( $_SESSION['APPLICATION'], $oPMScript->aFields ); } - + return $result; } \ No newline at end of file diff --git a/workflow/engine/classes/class.processes.php b/workflow/engine/classes/class.processes.php index 3f0d72746..cf076c52c 100755 --- a/workflow/engine/classes/class.processes.php +++ b/workflow/engine/classes/class.processes.php @@ -969,6 +969,18 @@ class Processes } } + if (isset($oData->taskExtraProperties)) { + foreach ($oData->taskExtraProperties as $key => $value) { + $record = $value; + + if (isset($map[$record["OBJ_UID"]])) { + $newUid = $map[$record["OBJ_UID"]]; + + $oData->taskExtraProperties[$key]["OBJ_UID"] = $newUid; + } + } + } + if (isset($oData->webEntry)) { foreach ($oData->webEntry as $key => $value) { $record = $value; @@ -3739,9 +3751,25 @@ class Processes } } - // for public files + //For public files $PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP . $data->process['PRO_UID']; + //Get WebEntry file names + $arrayWebEntryFile = array(); + + if (is_dir($PUBLIC_ROOT_PATH)) { + if ($dirh = opendir($PUBLIC_ROOT_PATH)) { + while (($file = readdir($dirh)) !== false) { + if (preg_match("/^(.+)Post\.php$/", $file, $arrayMatch)) { + $arrayWebEntryFile[] = $arrayMatch[1] . ".php"; + $arrayWebEntryFile[] = $arrayMatch[1] . "Post.php"; + } + } + + closedir($dirh); + } + } + //if this process have any mailfile if (is_dir( $PUBLIC_ROOT_PATH )) { //get mail files list from this directory @@ -3749,6 +3777,10 @@ class Processes foreach ($file_list as $filename) { // verify if this filename is a valid file, because it could be . or .. on *nix systems if ($filename != '.' && $filename != '..') { + if (in_array($filename, $arrayWebEntryFile)) { + continue; + } + if (@is_readable( $PUBLIC_ROOT_PATH . PATH_SEP . $filename )) { $sFileName = $PUBLIC_ROOT_PATH . PATH_SEP . $filename; if (file_exists( $sFileName )) { @@ -4094,7 +4126,6 @@ class Processes $fsData = intval( fread( $fp, 9 ) ); //reading the size of $oData $contents = fread( $fp, $fsData ); //reading string $oData - $path = PATH_DYNAFORM . $oData->process['PRO_UID'] . PATH_SEP; if (! is_dir( $path )) { G::verifyPath( $path, true ); @@ -4180,6 +4211,28 @@ class Processes } if (trim( $sIdentifier ) == 'PUBLIC') { + //Get WebEntry file names + $arrayWebEntryFile = array(); + + $fh = fopen($pmFilename, "rb"); + $contents = fread($fh, intval(fread($fh, 9))); //Reading string $oData + + while (!feof($fh)) { + $fsFileName = intval(fread($fh, 9)); //Reading the size of $filename + + if ($fsFileName > 0) { + $sFileName = fread($fh, $fsFileName); //Reading filename string + + if (preg_match("/^(.+)Post\.php$/", $sFileName, $arrayMatch)) { + $arrayWebEntryFile[] = $arrayMatch[1] . ".php"; + $arrayWebEntryFile[] = $arrayMatch[1] . "Post.php"; + } + } + } + + fclose($fh); + + //Public files $sIdentifier = 1; while (! feof( $fp ) && is_numeric( $sIdentifier )) { $sIdentifier = fread( $fp, 9 ); //reading the size of $filename @@ -4192,6 +4245,11 @@ class Processes if ($fsContent > 0) { $fileContent = fread( $fp, $fsContent ); //reading string $XmlContent $newFileName = $pathPublic . $sFileName; + + if (in_array($sFileName, $arrayWebEntryFile)) { + continue; + } + $bytesSaved = @file_put_contents( $newFileName, $fileContent ); if ($bytesSaved != $fsContent) { throw (new Exception( 'Error writing Public file in directory : ' . $pathPublic )); @@ -4204,7 +4262,6 @@ class Processes fclose( $fp ); return true; - } /** diff --git a/workflow/engine/classes/class.tasks.php b/workflow/engine/classes/class.tasks.php index e464bfb7b..a276e2e5d 100755 --- a/workflow/engine/classes/class.tasks.php +++ b/workflow/engine/classes/class.tasks.php @@ -391,12 +391,23 @@ class Tasks $oCriteria = new Criteria('workflow'); $oCriteria->add(ObjectPermissionPeer::OP_TASK_SOURCE, $sTaskUID); ObjectPermissionPeer::doDelete($oCriteria); + + //Delete Cases Schedulers + $criteria = new Criteria("workflow"); + + $criteria->add(CaseSchedulerPeer::TAS_UID, $sTaskUID, Criteria::EQUAL); + + $result = CaseSchedulerPeer::doDelete($criteria); + + //Delete Configuration + $criteria = new Criteria("workflow"); + + $criteria->add(ConfigurationPeer::OBJ_UID, $sTaskUID, Criteria::EQUAL); + + $result = ConfigurationPeer::doDelete($criteria); + //Delete task $oTask->remove($sTaskUID); - //Delete cases schedulers added by krlos - $oCriteria = new Criteria('workflow'); - $oCriteria->add(CaseSchedulerPeer::TAS_UID, $sTaskUID); - CaseSchedulerPeer::doDelete($oCriteria); } catch (Exception $oError) { throw ($oError); } @@ -855,4 +866,4 @@ class Tasks } } } - \ No newline at end of file + diff --git a/workflow/engine/classes/class.webdav.php b/workflow/engine/classes/class.webdav.php index bc56cca59..3b56c1068 100755 --- a/workflow/engine/classes/class.webdav.php +++ b/workflow/engine/classes/class.webdav.php @@ -902,16 +902,21 @@ class ProcessMakerWebDav extends HTTP_WebDAV_Server $dir = dirname($path) . "/"; $base = basename($path); + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); foreach ($options["props"] as $key => $prop) { if ($prop["ns"] == "DAV:") { $options["props"][$key]['status'] = "403 Forbidden"; } else { if (isset($prop["val"])) { - $query = "REPLACE INTO properties SET path = '$options[path]', name = '$prop[name]', ns= '$prop[ns]', value = '$prop[val]'"; + $query = "REPLACE INTO properties SET path = '%s', name = '%s', ns= '%s', value = '%s'"; + $query = $filter->preventSqlInjection($query, Array($options['path'],$prop['name'],$prop['ns'],$prop['val'])); error_log($query); } else { - $query = "DELETE FROM properties WHERE path = '$options[path]' AND name = '$prop[name]' AND ns = '$prop[ns]'"; + $query = "DELETE FROM properties WHERE path = '%s' AND name = '%s' AND ns = '%s'"; + $query = $filter->preventSqlInjection($query, Array($options['path'],$prop['name'],$prop['ns'])); } mysql_query($query); } diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index afa618856..23ff0a97c 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1610,12 +1610,14 @@ class workspaceTools $workspace->checkMafeRequirements($workspaceName, $lang); + /*----------------------------------********---------------------------------*/ $start = microtime(true); - CLI::logging("> Updating cache view...\n"); - $workspace->upgradeCacheView(true, false, $lang); + CLI::logging("> Updating List tables...\n"); + $workspace->migrateList($workspace->name); $stop = microtime(true); $final = $stop - $start; - CLI::logging("<*> Updating cache view Process took $final seconds.\n"); + CLI::logging("<*> Updating List Process took $final seconds.\n"); + /*----------------------------------********---------------------------------*/ mysql_close($link); } @@ -1881,6 +1883,7 @@ class workspaceTools } $this->initPropel(true); $appCache = new AppCacheView(); + $users = new Users(); G::LoadClass("case"); $case = new Cases(); @@ -1921,12 +1924,28 @@ class workspaceTools $rsCriteria = AppCacheViewPeer::doSelectRS($inbCriteria); $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $criteriaUser = new Criteria(); + $criteriaUser->addSelectColumn( UsersPeer::USR_UID ); + $criteriaUser->addSelectColumn( UsersPeer::USR_FIRSTNAME ); + $criteriaUser->addSelectColumn( UsersPeer::USR_LASTNAME ); + $criteriaUser->addSelectColumn( UsersPeer::USR_USERNAME ); //Insert new data LIST_INBOX while ($rsCriteria->next()) { $row = $rsCriteria->getRow(); $isSelfService = ($row['USR_UID'] == '') ? true : false; if($row["DEL_THREAD_STATUS"] == 'OPEN'){ + //Update information about the previous_user $row["DEL_PREVIOUS_USR_UID"] = $row["PREVIOUS_USR_UID"]; + $criteriaUser->add( UsersPeer::USR_UID, $row["PREVIOUS_USR_UID"] ); + $datasetU = UsersPeer::doSelectRS($criteriaUser); + $datasetU->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $datasetU->next(); + $arrayUsers = $datasetU->getRow(); + $row["DEL_PREVIOUS_USR_USERNAME"] = $arrayUsers["USR_USERNAME"]; + $row["DEL_PREVIOUS_USR_FIRSTNAME"]= $arrayUsers["USR_FIRSTNAME"]; + $row["DEL_PREVIOUS_USR_LASTNAME"] = $arrayUsers["USR_LASTNAME"]; + //Update the due date + $row["DEL_DUE_DATE"] = $row["DEL_TASK_DUE_DATE"]; $listInbox = new ListInbox(); $listInbox->remove($row["APP_UID"],$row["DEL_INDEX"]); $listInbox->setDeleted(false); diff --git a/workflow/engine/classes/model/Application.php b/workflow/engine/classes/model/Application.php index 944bf3932..c7b754156 100755 --- a/workflow/engine/classes/model/Application.php +++ b/workflow/engine/classes/model/Application.php @@ -56,6 +56,11 @@ class Application extends BaseApplication */ public function getAppTitle() { + $oApplication = new Application; + if (!$oApplication->exists($this->getAppUid())) { + return false; + } + if ($this->getAppUid() == '') { throw (new Exception( "Error in getAppTitle, the APP_UID can't be blank")); } @@ -311,7 +316,9 @@ class Application extends BaseApplication try { $oApplication = ApplicationPeer::retrieveByPk( $AppUid ); - + if (!$oApplication) { + return false; + } if (is_object($oApplication) && get_class ($oApplication) == 'Application' ) { $aFields = $oApplication->toArray(BasePeer::TYPE_FIELDNAME); $this->fromArray($aFields, BasePeer::TYPE_FIELDNAME); @@ -574,19 +581,19 @@ class Application extends BaseApplication } /*----------------------------------********---------------------------------*/ - public function calculateAppDuration ($cron = 0) - { - try { - if ($cron == 1) { - $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); - $arrayCron["processcTimeStart"] = time(); - @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); - } - - $calendar = new calendar(); - - $c = new Criteria( 'workflow' ); - $c->clearSelectColumns(); + public function calculateAppDuration ($cron = 0) + { + try { + if ($cron == 1) { + $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); + $arrayCron["processcTimeStart"] = time(); + @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); + } + + $calendar = new calendar(); + + $c = new Criteria( 'workflow' ); + $c->clearSelectColumns(); $c->addSelectColumn( ApplicationPeer::APP_UID ); $c->addSelectColumn( ApplicationPeer::APP_NUMBER ); $c->addSelectColumn( ApplicationPeer::APP_STATUS ); @@ -602,80 +609,80 @@ class Application extends BaseApplication $c->addSelectColumn( ProcessPeer::PRO_TIME ); $c->addSelectColumn( ProcessPeer::PRO_TIMEUNIT ); - $c->addJoin( ApplicationPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN ); - - $rs = ApplicationPeer::doSelectRS( $c ); - $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $rs->next(); - $row = $rs->getRow(); - $i = 0; - - $now = strtotime( 'now' ); - while (is_array( $row )) { - $appNumber = $row['APP_NUMBER']; - $appStatus = $row['APP_STATUS']; - $appInitUser = $row['APP_INIT_USER']; - $appCurUser = $row['APP_CUR_USER']; - $appCreateDate = $row['APP_CREATE_DATE']; - $appInitDate = $row['APP_INIT_DATE']; - $appFinishDate = $row['APP_FINISH_DATE']; + $c->addJoin( ApplicationPeer::PRO_UID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN ); + + $rs = ApplicationPeer::doSelectRS( $c ); + $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $rs->next(); + $row = $rs->getRow(); + $i = 0; + + $now = strtotime( 'now' ); + while (is_array( $row )) { + $appNumber = $row['APP_NUMBER']; + $appStatus = $row['APP_STATUS']; + $appInitUser = $row['APP_INIT_USER']; + $appCurUser = $row['APP_CUR_USER']; + $appCreateDate = $row['APP_CREATE_DATE']; + $appInitDate = $row['APP_INIT_DATE']; + $appFinishDate = $row['APP_FINISH_DATE']; $appUpdateDate = $row['APP_UPDATE_DATE']; $appDuration = $row['APP_DURATION']; $proTime = $row['PRO_TIME']; $proTimeUnit = $row['PRO_TIMEUNIT']; - $proUid = $row['PRO_UID']; - - //get the object, - $oApp = ApplicationPeer::retrieveByPk( $row['APP_UID'] ); - - //getting the calendar - $calendar->getCalendar(null, $proUid); + $proUid = $row['PRO_UID']; + + //get the object, + $oApp = ApplicationPeer::retrieveByPk( $row['APP_UID'] ); + + //getting the calendar + $calendar->getCalendar(null, $proUid); $calData = $calendar->getCalendarData(); /*if(G::toUpper($proTimeUnit) != 'DAYS'){ //if it is not in days must be in mins. $proTime = $proTime / (24 * 60 * 60); //converting to Days }*/ - - $proDueDate = $calendar->dashCalculateDate($row['APP_INIT_DATE'], $proTime, $proTimeUnit, $calData); //date when the process has to finish + + $proDueDate = $calendar->dashCalculateDate($row['APP_INIT_DATE'], $proTime, $proTimeUnit, $calData); //date when the process has to finish if($appFinishDate == null){//When the process didnt finish yet. //Duration - $appDuration = $calendar->dashCalculateDurationWithCalendar($appInitDate, date("Y-m-d H:i:s"), $calData ); - + $appDuration = $calendar->dashCalculateDurationWithCalendar($appInitDate, date("Y-m-d H:i:s"), $calData ); - $appDuration = $appDuration / (24 * 60 * 60); //Saving the proDuration in days. The calculateDurationWithCalendar func returns segs. + + $appDuration = $appDuration / (24 * 60 * 60); //Saving the proDuration in days. The calculateDurationWithCalendar func returns segs. $oApp->setAppDuration( $appDuration ); //Delay Duration - $delayDuration = $calendar->dashCalculateDurationWithCalendar( $proDueDate, date("Y-m-d H:i:s"), $calData );//it returns in mins + $delayDuration = $calendar->dashCalculateDurationWithCalendar( $proDueDate, date("Y-m-d H:i:s"), $calData );//it returns in mins $delayDuration = $delayDuration / (24 * 60 * 60); //Days $oApp->setAppDelayDuration( $delayDuration ); } else { - //Duration - $appDuration = $calendar->dashCalculateDurationWithCalendar($appInitDate, $appFinishDate, $calData ); - $appDuration = $appDuration / (24 * 60 * 60); //Saving the proDuration in days. The calculateDurationWithCalendar func returns mins. + //Duration + $appDuration = $calendar->dashCalculateDurationWithCalendar($appInitDate, $appFinishDate, $calData ); + $appDuration = $appDuration / (24 * 60 * 60); //Saving the proDuration in days. The calculateDurationWithCalendar func returns mins. $oApp->setAppDuration( $appDuration ); - - //Delay Duration - $delayDuration = $calendar->dashCalculateDurationWithCalendar( $proDueDate, $appFinishDate, $calData ); + + //Delay Duration + $delayDuration = $calendar->dashCalculateDurationWithCalendar( $proDueDate, $appFinishDate, $calData ); $delayDuration = $delayDuration / (24 * 60 * 60); //Days $oApp->setAppDelayDuration( $delayDuration ); } - - //and finally save the record - $RES = $oApp->save(); - $rs->next(); - $row = $rs->getRow(); - } - - if ($cron == 1) { - $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); - $arrayCron["processcTimeStart"] = time(); - @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); - } - } catch (Exception $oError) { - error_log( $oError->getMessage() ); - } + + //and finally save the record + $RES = $oApp->save(); + $rs->next(); + $row = $rs->getRow(); + } + + if ($cron == 1) { + $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); + $arrayCron["processcTimeStart"] = time(); + @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); + } + } catch (Exception $oError) { + error_log( $oError->getMessage() ); + } } /*----------------------------------********---------------------------------*/ } diff --git a/workflow/engine/classes/model/Configuration.php b/workflow/engine/classes/model/Configuration.php index 50fd285a1..51c8fb86c 100755 --- a/workflow/engine/classes/model/Configuration.php +++ b/workflow/engine/classes/model/Configuration.php @@ -1,28 +1,42 @@ begin(); - $this->setCfgUid($aData['CFG_UID']); - $this->setObjUid($aData['OBJ_UID']); - $this->setCfgValue(isset($aData['CFG_VALUE'])?$aData['CFG_VALUE']:''); - $this->setProUid($aData['PRO_UID']); - $this->setUsrUid($aData['USR_UID']); - $this->setAppUid($aData['APP_UID']); - if ($this->validate()) { - $result=$this->save(); - $con->commit(); + $configuration = new Configuration(); + + $configuration->setCfgUid($arrayData["CFG_UID"]); + $configuration->setObjUid($arrayData["OBJ_UID"]); + $configuration->setCfgValue((isset($arrayData["CFG_VALUE"]))? $arrayData["CFG_VALUE"] : ""); + $configuration->setProUid($arrayData["PRO_UID"]); + $configuration->setUsrUid($arrayData["USR_UID"]); + $configuration->setAppUid($arrayData["APP_UID"]); + + if ($configuration->validate()) { + $cnn->begin(); + + $result = $configuration->save(); + + $cnn->commit(); + + //Return return $result; } else { - $con->rollback(); - throw(new Exception("Failed Validation in class ".get_class($this).".")); + $msg = ""; + + foreach ($configuration->getValidationFailures() as $validationFailure) { + $msg = $msg . (($msg != "")? "\n" : "") . $validationFailure->getMessage(); + } + + throw new Exception(G::LoadTranslation("ID_RECORD_CANNOT_BE_CREATED") . (($msg != "")? "\n" . $msg : "")); } } catch (Exception $e) { - $con->rollback(); - throw($e); + $cnn->rollback(); + + throw $e; } } diff --git a/workflow/engine/controllers/installer.php b/workflow/engine/controllers/installer.php index 706c405c5..fd7df39a4 100644 --- a/workflow/engine/controllers/installer.php +++ b/workflow/engine/controllers/installer.php @@ -315,6 +315,10 @@ class Installer extends Controller $info->success = false; } } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $pathShared = $filter->validateInput($_REQUEST['pathShared'], 'path'); if ($info->pathShared->result) { $aux = pathinfo( $_REQUEST['pathLogFile'] ); @@ -322,7 +326,7 @@ class Installer extends Controller if (is_dir( $aux['dirname'] )) { if (! file_exists( $_REQUEST['pathLogFile'] )) { @file_put_contents( $_REQUEST['pathLogFile'], '' ); - @chmod($_REQUEST['pathShared'], 0770); + @chmod($pathShared , 0770); } } } @@ -388,7 +392,11 @@ class Installer extends Controller return $false; } } - + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $logFile = $filter->validateInput($logFile, 'path'); + $fpt = fopen( $logFile, 'a' ); fwrite( $fpt, sprintf( "%s %s\n", date( 'Y:m:d H:i:s' ), trim( $text ) ) ); fclose( $fpt ); diff --git a/workflow/engine/js/processmap/core/processmap.js b/workflow/engine/js/processmap/core/processmap.js index 30ce8b36c..4746bcd6e 100755 --- a/workflow/engine/js/processmap/core/processmap.js +++ b/workflow/engine/js/processmap/core/processmap.js @@ -2661,9 +2661,10 @@ processmap.prototype={ uid:false }; this.data.build.text(index); + text = text.replace(/"/g, '\\"'); var r = new leimnud.module.rpc.xmlhttp({ url:this.options.dataServer, - args:"action=addText&data="+{uid:this.options.uid,label:text,position:{x:pos.x,y:pos.y}}.toJSONString() + args:"action=addText&data="+{uid:this.options.uid,label:encodeURIComponent(text),position:{x:pos.x,y:pos.y}}.toJSONString() }); r.callback=function(rpc,index){ var rs = rpc.xmlhttp.responseText.parseJSON(); diff --git a/workflow/engine/methods/cases/proxyReassignUsersList.php b/workflow/engine/methods/cases/proxyReassignUsersList.php index 5b8a7cbe9..ae662cbd5 100755 --- a/workflow/engine/methods/cases/proxyReassignUsersList.php +++ b/workflow/engine/methods/cases/proxyReassignUsersList.php @@ -52,6 +52,7 @@ function array_sort ($array, $on, $order = SORT_ASC, $query = '') } } } + return $new_array; } // $APP_UIDS = explode(',', $_POST['APP_UID']); diff --git a/workflow/engine/methods/processes/processes_Ajax.php b/workflow/engine/methods/processes/processes_Ajax.php index 17a4ab221..d43672bc3 100755 --- a/workflow/engine/methods/processes/processes_Ajax.php +++ b/workflow/engine/methods/processes/processes_Ajax.php @@ -38,7 +38,7 @@ try { break; } */ //$oJSON = new Services_JSON(); - + G::LoadSystem('inputfilter'); $filter = new InputFilter(); $_GET = $filter->xssFilterHard($_GET); @@ -307,7 +307,7 @@ try { G::auditLog('DeleteLines','Delete all lines in process "'.$resultProcess['PRO_TITLE'].'"'); break; case 'addText': - $sOutput = $oProcessMap->addText($oData->uid, $oData->label, $oData->position->x, $oData->position->y); + $sOutput = $oProcessMap->addText($oData->uid, html_entity_decode(html_entity_decode($oData->label)), $oData->position->x, $oData->position->y); $sOutputAux = G::json_decode($sOutput); $sOutputAux = (array)$sOutputAux; G::auditLog('AddText','Add new text ('.$sOutputAux['uid'].') in process "'.$resultProcess['PRO_TITLE'].'"'); diff --git a/workflow/engine/methods/tracker/tracker_DynaDocs.php b/workflow/engine/methods/tracker/tracker_DynaDocs.php index 5a7ab49c1..1df85a841 100755 --- a/workflow/engine/methods/tracker/tracker_DynaDocs.php +++ b/workflow/engine/methods/tracker/tracker_DynaDocs.php @@ -66,5 +66,44 @@ if ($noShowTitle == 0) { $G_PUBLISH->AddContent( 'propeltable', 'paged-table', 'tracker/tracker_DynaDocs', $oProcessMap->getCaseTrackerObjectsCriteria( $_SESSION['PROCESS'] ), array ('VIEW' => G::LoadTranslation( 'ID_VIEW' ) ) ); -G::RenderPage( 'publish' ); +$bpmn = new ProcessMaker\Project\Bpmn(); +$flagIsBpmn = ($bpmn->exists($_SESSION["PROCESS"]))? true : false; +if ($flagIsBpmn) { + $urlTrackerProcessMap = "../designer?prj_uid=" . $_SESSION["PROCESS"] . "&prj_readonly=true&app_uid=" . $_SESSION["APPLICATION"] . "&tracker_designer=1"; + + $_SESSION["TRACKER_JAVASCRIPT"] = " + + "; +} + +G::RenderPage("publish"); diff --git a/workflow/engine/methods/tracker/tracker_History.php b/workflow/engine/methods/tracker/tracker_History.php index f608d532d..6dd885292 100755 --- a/workflow/engine/methods/tracker/tracker_History.php +++ b/workflow/engine/methods/tracker/tracker_History.php @@ -62,5 +62,45 @@ if ($noShowTitle == 0) { $G_PUBLISH->AddContent( 'smarty', 'cases/cases_title', '', '', $aFields ); } $G_PUBLISH->AddContent( 'propeltable', 'paged-table', 'tracker/tracker_TransferHistory', Cases::getTransferHistoryCriteria( $_SESSION['APPLICATION'] ), array () ); -G::RenderPage( 'publish' ); +$bpmn = new ProcessMaker\Project\Bpmn(); +$flagIsBpmn = ($bpmn->exists($_SESSION["PROCESS"]))? true : false; + +if ($flagIsBpmn) { + $urlTrackerProcessMap = "../designer?prj_uid=" . $_SESSION["PROCESS"] . "&prj_readonly=true&app_uid=" . $_SESSION["APPLICATION"] . "&tracker_designer=1"; + + $_SESSION["TRACKER_JAVASCRIPT"] = " + + "; +} + +G::RenderPage("publish"); diff --git a/workflow/engine/methods/tracker/tracker_Messages.php b/workflow/engine/methods/tracker/tracker_Messages.php index 9da5bfbd2..587437fbe 100755 --- a/workflow/engine/methods/tracker/tracker_Messages.php +++ b/workflow/engine/methods/tracker/tracker_Messages.php @@ -64,5 +64,45 @@ if ($noShowTitle == 0) { } $G_PUBLISH->AddContent( 'propeltable', 'paged-table', 'tracker/tracker_Messages', Cases::getHistoryMessagesTracker( $_SESSION['APPLICATION'] ), array ('VIEW' => G::LoadTranslation( 'ID_VIEW' ) ) ); -G::RenderPage( 'publish' ); +$bpmn = new ProcessMaker\Project\Bpmn(); +$flagIsBpmn = ($bpmn->exists($_SESSION["PROCESS"]))? true : false; + +if ($flagIsBpmn) { + $urlTrackerProcessMap = "../designer?prj_uid=" . $_SESSION["PROCESS"] . "&prj_readonly=true&app_uid=" . $_SESSION["APPLICATION"] . "&tracker_designer=1"; + + $_SESSION["TRACKER_JAVASCRIPT"] = " + + "; +} + +G::RenderPage("publish"); diff --git a/workflow/engine/methods/tracker/tracker_ViewMap.php b/workflow/engine/methods/tracker/tracker_ViewMap.php index 013e3c772..a7a531507 100755 --- a/workflow/engine/methods/tracker/tracker_ViewMap.php +++ b/workflow/engine/methods/tracker/tracker_ViewMap.php @@ -59,7 +59,7 @@ while ($ds->next()) { $row = $ds->getRow(); $bpmnProjects[] = $row['PRJ_UID']; } - + switch (($aCaseTracker['CT_MAP_TYPE'])) { case 'NONE': //Nothing @@ -71,11 +71,48 @@ switch (($aCaseTracker['CT_MAP_TYPE'])) { $aFields = $oCase->loadCase( $_SESSION['APPLICATION'] ); if (in_array($aFields['PRO_UID'], $bpmnProjects)) { //bpmb - $_SESSION["APP_UID"] = $aFields["APP_UID"]; + $_SESSION["APPLICATION"] = $aFields["APP_UID"]; $G_PUBLISH = new Publisher(); $G_PUBLISH->AddContent( 'view', 'tracker/viewMap' ); - G::RenderPage( 'publish' ); + + $urlTrackerProcessMap = "../designer?prj_uid=" . $_SESSION["PROCESS"] . "&prj_readonly=true&app_uid=" . $_SESSION["APPLICATION"] . "&tracker_designer=1"; + + $_SESSION["TRACKER_JAVASCRIPT"] = " + + "; + + G::RenderPage("publish"); //note: url processmap "../designer?prj_uid=$_SESSION['PROCESS']&prj_readonly=true&app_uid=$_SESSION['APP_UID']" + break; } if (isset( $aFields['TITLE'] )) { @@ -246,9 +283,8 @@ switch (($aCaseTracker['CT_MAP_TYPE'])) { }.extend(this); rpcRequest.make(); - + });' ); G::RenderPage( 'publish' ); break; } - diff --git a/workflow/engine/methods/triggers/triggers_WizardSave.php b/workflow/engine/methods/triggers/triggers_WizardSave.php index 05655150b..8416ea954 100755 --- a/workflow/engine/methods/triggers/triggers_WizardSave.php +++ b/workflow/engine/methods/triggers/triggers_WizardSave.php @@ -63,7 +63,7 @@ foreach ($aInfoFunction as $k => $v) { } if ($aDataTriggers[$sOptionTrigger] != '') { - if ((strstr($aDataTriggers[$sOptionTrigger], "@@"))) { + if ((strstr($aDataTriggers[$sOptionTrigger], "@@")) || ($aDataTriggers['PMFUNTION_NAME'] == 'evaluateFunction' && $k == 0 && strstr($aDataTriggers[$sOptionTrigger], "@="))) { $option = trim($aDataTriggers[$sOptionTrigger]); } else { @@ -81,7 +81,7 @@ foreach ($aInfoFunction as $k => $v) { $option = floatval($aDataTriggers[$sOptionTrigger]); break; default: - $option = (is_numeric($aDataTriggers[$sOptionTrigger]) || is_bool($aDataTriggers[$sOptionTrigger]) ) ? trim($aDataTriggers[$sOptionTrigger]) : (strstr($aDataTriggers[$sOptionTrigger], "'.array.'")) ? trim($aDataTriggers[$sOptionTrigger]) : "'" . trim($aDataTriggers[$sOptionTrigger]) . "'"; + $option = (is_numeric($aDataTriggers[$sOptionTrigger]) || is_bool($aDataTriggers[$sOptionTrigger]) ) ? trim($aDataTriggers[$sOptionTrigger]) : (strstr($aDataTriggers[$sOptionTrigger], "'.array.'")) ? trim($aDataTriggers[$sOptionTrigger]) : '"' . trim($aDataTriggers[$sOptionTrigger]) . '"'; break; } } diff --git a/workflow/engine/methods/triggers/triggers_WizardUpdate.php b/workflow/engine/methods/triggers/triggers_WizardUpdate.php index 33c545186..0d4799373 100755 --- a/workflow/engine/methods/triggers/triggers_WizardUpdate.php +++ b/workflow/engine/methods/triggers/triggers_WizardUpdate.php @@ -66,7 +66,7 @@ foreach ($aInfoFunction as $k => $v) { } if ($aDataTriggers[$sOptionTrigger] != '') { - if ((strstr($aDataTriggers[$sOptionTrigger], "@@"))) { + if ((strstr($aDataTriggers[$sOptionTrigger], "@@")) || ($aDataTriggers['PMFUNTION_NAME'] == 'evaluateFunction' && $k == 0 && strstr($aDataTriggers[$sOptionTrigger], "@="))) { $option = $aDataTriggers[$sOptionTrigger]; } else { @@ -84,7 +84,7 @@ foreach ($aInfoFunction as $k => $v) { $option = floatval($aDataTriggers[$sOptionTrigger]); break; default: - $option = (is_numeric($aDataTriggers[$sOptionTrigger]) || is_bool($aDataTriggers[$sOptionTrigger]) ) ? trim($aDataTriggers[$sOptionTrigger]) : (strstr($aDataTriggers[$sOptionTrigger], "array")) ? trim($aDataTriggers[$sOptionTrigger]) : "'" . trim($aDataTriggers[$sOptionTrigger]) . "'"; + $option = (is_numeric($aDataTriggers[$sOptionTrigger]) || is_bool($aDataTriggers[$sOptionTrigger]) ) ? trim($aDataTriggers[$sOptionTrigger]) : (strstr($aDataTriggers[$sOptionTrigger], "array")) ? trim($aDataTriggers[$sOptionTrigger]) : '"' . trim($aDataTriggers[$sOptionTrigger]) . '"'; break; } } diff --git a/workflow/engine/skinEngine/base/layout.html b/workflow/engine/skinEngine/base/layout.html index cf192a18f..13b89edfc 100755 --- a/workflow/engine/skinEngine/base/layout.html +++ b/workflow/engine/skinEngine/base/layout.html @@ -58,10 +58,16 @@ {/if}