Skip to content
This repository was archived by the owner on Sep 13, 2024. It is now read-only.

Commit ff558f9

Browse files
Merge pull request #2022 from YetiForceCompany/master
Master
2 parents 0bd8442 + 3ac4ff7 commit ff558f9

File tree

710 files changed

+19100
-7948
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

710 files changed

+19100
-7948
lines changed

api/webservice/Portal/modules/Base/GetModulesList.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ class API_Base_GetModulesList extends BaseAction
1313

1414
public function getModulesList()
1515
{
16-
$modules = ['HelpDesk' => 'HelpDesk','Accounts' => 'Accounts'];
17-
16+
$db = PearDatabase::getInstance();
17+
$query = 'SELECT * FROM vtiger_tab WHERE isentitytype = ? AND presence = ?';
18+
$result = $db->pquery($query, [1, 0]);
19+
$modules = [];
20+
while ($row = $db->fetch_array($result)) {
21+
$modules[$row['name']] = $row['name'];
22+
}
1823
return $modules;
1924
}
2025
}

config/config.template.php

+10-2
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,20 @@
237237

238238
// autocomplete global search - Whether or not automated search should be turned on"
239239
$gsAutocomplete = 1; // 0 or 1
240-
241240
// autocomplete global search - The minimum number of characters a user must type before a search is performed.
242241
$gsMinLength = 3;
243242

244243
// autocomplete global search - Amount of returned results.
245244
$gsAmountResponse = 10;
246245

247246
// Is sending emails active.
248-
$isActiveSendingMails = false;
247+
$isActiveSendingMails = true;
248+
249+
// Should the task in cron be unblocked if the script execution time was exceeded
250+
$unblockedTimeoutCronTasks = true;
251+
252+
// The maximum time of executing a cron. Recommended same as the max_exacution_time parameter value.
253+
$maxExecutionCronTime = 3600;
254+
255+
// System's language selection in the login window (true/false).
256+
$langInLoginView = false;

config/performance.php

+3
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@
2727

2828
// Display administrators in the list of users (Assigned To)
2929
'SHOW_ADMINISTRATORS_IN_USERS_LIST' => true,
30+
31+
// The numbers of emails downloaded during one scanning
32+
'NUMBERS_EMAILS_DOWNLOADED_DURING_ONE_SCANNING' => 100,
3033
);

config/security.php

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
/* {[The file is published on the basis of YetiForce Public License that can be found in the following directory: licenses/License.html]} */
3+
$SECURITY_CONFIG = [
4+
// Possible to reset the password while logging in (true/false)
5+
'RESET_LOGIN_PASSWORD' => false,
6+
];

config/version.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
* All Rights Reserved.
99
* Contributor(s): YetiForce.com
1010
* ****************************************************************************** */
11-
$patch_version = '20150831';
12-
$YetiForce_current_version = '2.2.0';
11+
$patch_version = '20151013';
12+
$YetiForce_current_version = '2.3.0';
1313
$_SESSION['yetiforce_version'] = $YetiForce_current_version;

cron/MultiReference.service

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* Multi reference value cron
4+
* @package YetiForce.Cron
5+
* @license licenses/License.html
6+
* @author Mariusz Krzaczkowski <[email protected]>
7+
*/
8+
include_once 'include/main/WebUI.php';
9+
$current_user = Users::getActiveAdminUser();
10+
11+
$db = PearDatabase::getInstance();
12+
$log = vglobal('log');
13+
$log = &LoggerManager::getLogger('MultiReferenceValue');
14+
$log->info('Cron MultiReferenceValue - Start');
15+
16+
$result = $db->pquery('SELECT * FROM s_yf_multireference');
17+
while ($multireference = $db->fetch_array($result)) {
18+
$entity = CRMEntity::getInstance($multireference['source_module']);
19+
$queryGenerator = new QueryGenerator($multireference['source_module'], $current_user);
20+
$queryGenerator->setFields(['id']);
21+
$queryGenerator->addCustomWere(['column' => $entity->table_index, 'operator' => '>', 'value' => $multireference['lastid'], 'glue' => 'AND']);
22+
$query = $queryGenerator->getQuery();
23+
$query .= ' ORDER BY ' . $entity->table_index . ' ASC';
24+
$recordsResult = $db->query($query);
25+
26+
$fields = Vtiger_MultiReferenceValue_UIType::getMultiReferenceValueFields($multireference['source_module'], $multireference['dest_module']);
27+
while ($id = $db->getSingleValue($recordsResult)) {
28+
foreach ($fields as $field) {
29+
$fieldModel = new Vtiger_Field_Model();
30+
$fieldModel->initialize($field);
31+
$UITypeModel = $fieldModel->getUITypeModel();
32+
$UITypeModel->reloadValue($multireference['source_module'], $id);
33+
}
34+
$db->update('s_yf_multireference', ['lastid' => $id], 'source_module = ? AND dest_module = ?', [$multireference['source_module'], $multireference['dest_module']]);
35+
}
36+
$db->delete('s_yf_multireference', 'source_module = ? AND dest_module = ?', [$multireference['source_module'], $multireference['dest_module']]);
37+
}
38+
39+
$log->info('Cron MultiReferenceValue - End');

cron/SendReminder.service

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ INNER JOIN vtiger_activity_reminder ON vtiger_activity.activityid=vtiger_activit
1313
LEFT OUTER JOIN vtiger_recurringevents ON vtiger_activity.activityid=vtiger_recurringevents.activityid
1414
WHERE DATE_FORMAT(vtiger_activity.date_start,'%Y-%m-%d, %H:%i:%s') >= '".date('Y-m-d')."'
1515
AND vtiger_crmentity.crmid != 0
16-
AND vtiger_activity.eventstatus = 'Planned'
16+
AND vtiger_activity.status = 'PLL_PLANNED'
1717
AND vtiger_activity_reminder.reminder_sent = 0
1818
GROUP BY vtiger_activity.activityid,vtiger_recurringevents.recurringid";
1919

@@ -109,4 +109,4 @@ if($adb->num_rows($result) >= 1)
109109
}
110110
}
111111
}
112-
}
112+
}

cron/vtigercron.php

+37-25
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,20 @@
1111
/**
1212
* Start the cron services configured.
1313
*/
14-
require_once 'config/config.php';
15-
require_once 'config/debug.php';
16-
require_once 'config/performance.php';
17-
include_once 'vtlib/Vtiger/Cron.php';
14+
include_once 'include/main/WebUI.php';
15+
require_once('vtlib/Vtiger/Cron.php');
1816
require_once('modules/Emails/mail.php');
19-
// Extended inclusions
20-
require_once 'include/Loader.php';
21-
vimport('include.runtime.EntryPoint');
2217

23-
if (PHP_SAPI === "cli" || PHP_SAPI === "cgi-fcgi" || (isset($_SESSION["authenticated_user_id"]) && isset($_SESSION["app_unique_key"]) && $_SESSION["app_unique_key"] == $application_unique_key)) {
18+
Vtiger_Session::init();
19+
20+
if (PHP_SAPI === 'cli' || PHP_SAPI === 'cgi-fcgi' || (!empty(Vtiger_Session::get('authenticated_user_id')) && !empty(Vtiger_Session::get('app_unique_key')) && Vtiger_Session::get('app_unique_key') == vglobal('application_unique_key'))) {
2421
$log = LoggerManager::getLogger('CRON');
2522
vglobal('log', $log);
26-
23+
2724
$cronTasks = false;
2825
if (isset($_REQUEST['service'])) {
2926
// Run specific service
30-
$cronTasks = array(Vtiger_Cron::getInstance($_REQUEST['service']));
27+
$cronTasks = [Vtiger_Cron::getInstance($_REQUEST['service'])];
3128
} else {
3229
// Run all service
3330
$cronTasks = Vtiger_Cron::listAllActiveInstances();
@@ -39,40 +36,55 @@
3936
$current_user = vglobal('current_user');
4037
$current_user = Users::getActiveAdminUser();
4138

42-
echo sprintf('%s | Start CRON', date('Y-m-d H:i:s')) . "\n";
39+
echo sprintf('--------------- %s | Start CRON ----------', date('Y-m-d H:i:s')) . PHP_EOL;
4340
foreach ($cronTasks as $cronTask) {
4441
try {
45-
$cronTask->setBulkMode(true);
42+
// Timeout could happen if intermediate cron-tasks fails
43+
// and affect the next task. Which need to be handled in this cycle.
44+
if ($cronTask->hadTimeout()) {
45+
echo sprintf('%s | %s - Cron task had timedout as it was not completed last time it run' . PHP_EOL, date('Y-m-d H:i:s'), $cronTask->getName());
46+
if (vglobal('unblockedTimeoutCronTasks')) {
47+
$cronTask->unlockTask();
48+
}
49+
}
4650

4751
// Not ready to run yet?
48-
if (!$cronTask->isRunnable()) {
49-
echo sprintf("%s | %s - not ready to run as the time to run again is not completed\n", date('Y-m-d H:i:s'), $cronTask->getName());
52+
if ($cronTask->isRunning()) {
53+
$log->fatal($cronTask->getName() . ' - Task omitted, it has not been finished during the last scanning');
54+
echo sprintf('%s | %s - Task omitted, it has not been finished during the last scanning' . PHP_EOL, date('Y-m-d H:i:s'), $cronTask->getName());
5055
continue;
5156
}
5257

53-
// Timeout could happen if intermediate cron-tasks fails
54-
// and affect the next task. Which need to be handled in this cycle.
55-
if ($cronTask->hadTimedout()) {
56-
echo sprintf("%s | %s - cron task had timedout as it is not completed last time it run- restarting\n", date('Y-m-d H:i:s'), $cronTask->getName());
58+
// Not ready to run yet?
59+
if (!$cronTask->isRunnable()) {
60+
$log->info($cronTask->getName() . ' - Not ready to run as the time to run again is not completed');
61+
echo sprintf('%s | %s - Not ready to run as the time to run again is not completed' . PHP_EOL, date('Y-m-d H:i:s'), $cronTask->getName());
62+
continue;
5763
}
5864

5965
// Mark the status - running
6066
$cronTask->markRunning();
61-
echo sprintf('%s | %s (%s) - Start task', date('Y-m-d H:i:s'), $cronTask->getName(), date('Y-m-d H:i:s', $cronTask->getLastStart())) . "\n";
67+
echo sprintf('%s | %s - Start task' . PHP_EOL, date('Y-m-d H:i:s'), $cronTask->getName());
6268

6369
checkFileAccess($cronTask->getHandlerFile());
70+
ob_start();
6471
require_once $cronTask->getHandlerFile();
72+
$taskResponse = ob_get_contents();
73+
ob_end_clean();
74+
if ($taskResponse != '') {
75+
$log->warn($cronTask->getName() . ' - The task returned a message:' . PHP_EOL . $taskResponse);
76+
echo 'Task response:' . PHP_EOL . $taskResponse . PHP_EOL;
77+
}
6578

6679
// Mark the status - finished
6780
$cronTask->markFinished();
68-
echo "\n" . sprintf('%s | %s (%s) - End task', date('Y-m-d H:i:s'), $cronTask->getName(), date('Y-m-d H:i:s', $cronTask->getLastStart()), date('Y-m-d H:i:s', $cronTask->getLastEnd())) . "\n";
69-
} catch (Exception $e) {
70-
echo sprintf("%s | ERROR: %s - cron task execution throwed exception.\n", date('Y-m-d H:i:s'), $cronTask->getName());
71-
echo $e->getMessage();
72-
echo "\n";
81+
echo sprintf('%s | %s - End task', date('Y-m-d H:i:s'), $cronTask->getName()) . PHP_EOL;
82+
} catch (AppException $e) {
83+
echo sprintf('%s | ERROR: %s - Cron task execution throwed exception.' . PHP_EOL, date('Y-m-d H:i:s'), $cronTask->getName());
84+
echo $e->getMessage() . PHP_EOL;
7385
}
7486
}
75-
echo sprintf('%s | End CRON', date('Y-m-d H:i:s')) . "\n";
87+
echo sprintf('=============== %s | End CRON ==========', date('Y-m-d H:i:s')) . PHP_EOL;
7688
} else {
7789
echo("Access denied!");
7890
}

include/CRMEntity.php

+44-20
Original file line numberDiff line numberDiff line change
@@ -253,13 +253,12 @@ function insertIntoCrmEntity($module, $fileid = '')
253253
$description_val = from_html($this->column_fields['description'], ($insertion_mode == 'edit') ? true : false);
254254
$attention_val = from_html($this->column_fields['attention'], ($insertion_mode == 'edit') ? true : false);
255255
$was_read = ($this->column_fields['was_read'] == 'on') ? true : false;
256-
$inheritsharing = ($this->column_fields['inheritsharing'] == 'on') ? true : false;
257256
checkFileAccessForInclusion('user_privileges/user_privileges_' . $current_user->id . '.php');
258257
require('user_privileges/user_privileges_' . $current_user->id . '.php');
259258
$tabid = getTabid($module);
260259
if ($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) {
261-
$sql = "update vtiger_crmentity set smownerid=?,modifiedby=?,description=?,attention=?, modifiedtime=?, was_read=?, inheritsharing=? where crmid=?";
262-
$params = array($ownerid, $current_user->id, $description_val, $attention_val, $adb->formatDate($date_var, true), $was_read, $inheritsharing, $this->id);
260+
$sql = "update vtiger_crmentity set smownerid=?,modifiedby=?,description=?,attention=?, modifiedtime=?, was_read=? where crmid=?";
261+
$params = array($ownerid, $current_user->id, $description_val, $attention_val, $adb->formatDate($date_var, true), $was_read, $this->id);
263262
} else {
264263
$profileList = getCurrentUserProfileList();
265264
$perm_qry = "SELECT columnname FROM vtiger_field INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid = vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid = vtiger_field.fieldid WHERE vtiger_field.tabid = ? AND vtiger_profile2field.visible = 0 AND vtiger_profile2field.readonly = 0 AND vtiger_profile2field.profileid IN (" . generateQuestionMarks($profileList) . ") AND vtiger_def_org_field.visible = 0 and vtiger_field.tablename='vtiger_crmentity' and vtiger_field.presence in (0,2);";
@@ -269,8 +268,8 @@ function insertIntoCrmEntity($module, $fileid = '')
269268
$columname[] = $adb->query_result($perm_result, $i, "columnname");
270269
}
271270
if (is_array($columname) && in_array("description", $columname)) {
272-
$sql = "update vtiger_crmentity set smownerid=?,modifiedby=?,description=?, attention=?, modifiedtime=?,was_read=?, inheritsharing=? where crmid=?";
273-
$params = array($ownerid, $current_user->id, $description_val, $attention_val, $adb->formatDate($date_var, true), $was_read, $inheritsharing, $this->id);
271+
$sql = "update vtiger_crmentity set smownerid=?,modifiedby=?,description=?, attention=?, modifiedtime=?,was_read=? where crmid=?";
272+
$params = array($ownerid, $current_user->id, $description_val, $attention_val, $adb->formatDate($date_var, true), $was_read, $this->id);
274273
} else {
275274
$sql = "update vtiger_crmentity set smownerid=?,modifiedby=?, modifiedtime=? where crmid=?";
276275
$params = array($ownerid, $current_user->id, $adb->formatDate($date_var, true), $this->id);
@@ -290,7 +289,6 @@ function insertIntoCrmEntity($module, $fileid = '')
290289
// Customization
291290
$created_date_var = $adb->formatDate($date_var, true);
292291
$modified_date_var = $adb->formatDate($date_var, true);
293-
$inheritsharing = ($this->column_fields['inheritsharing'] == 'on') ? true : false;
294292
// Preserve the timestamp
295293
if (self::isBulkSaveMode()) {
296294
if (!empty($this->column_fields['createdtime']))
@@ -301,8 +299,8 @@ function insertIntoCrmEntity($module, $fileid = '')
301299

302300
$description_val = from_html($this->column_fields['description'], ($insertion_mode == 'edit') ? true : false);
303301
$attention_val = from_html($this->column_fields['attention'], ($insertion_mode == 'edit') ? true : false);
304-
$sql = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,attention,modifiedby,createdtime,modifiedtime,inheritsharing) values(?,?,?,?,?,?,?,?,?,?)";
305-
$params = array($current_id, $current_user->id, $ownerid, $module, $description_val, $attention_val, $current_user->id, $created_date_var, $modified_date_var, $inheritsharing);
302+
$sql = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,attention,modifiedby,createdtime,modifiedtime) values(?,?,?,?,?,?,?,?,?)";
303+
$params = array($current_id, $current_user->id, $ownerid, $module, $description_val, $attention_val, $current_user->id, $created_date_var, $modified_date_var);
306304
$adb->pquery($sql, $params);
307305

308306
$this->column_fields['createdtime'] = $created_date_var;
@@ -474,6 +472,13 @@ function insertIntoEntityTable($table_name, $module, $fileid = '')
474472
$field_list = $this->column_fields[$fieldname];
475473
}
476474
$fldvalue = $field_list;
475+
} elseif (in_array($uitype, [303, 304])) {
476+
if (is_array($this->column_fields[$fieldname])) {
477+
$field_list = implode(',', $this->column_fields[$fieldname]);
478+
} else {
479+
$field_list = $this->column_fields[$fieldname];
480+
}
481+
$fldvalue = $field_list;
477482
} elseif ($uitype == 5 || $uitype == 6 || $uitype == 23) {
478483
//Added to avoid function call getDBInsertDateValue in ajax save
479484
if (isset($current_user->date_format) && !$ajaxSave) {
@@ -538,6 +543,7 @@ function insertIntoEntityTable($table_name, $module, $fileid = '')
538543
else {
539544
$fldvalue = '';
540545
}
546+
541547
if ($fldvalue == '') {
542548
$fldvalue = $this->get_column_value($columname, $fldvalue, $fieldname, $uitype, $datatype);
543549
}
@@ -778,11 +784,11 @@ function retrieve_entity_info($record, $module)
778784
$result = $adb->pquery($sql, $params);
779785

780786
if (!$result || $adb->num_rows($result) < 1) {
781-
throw new Exception($app_strings['LBL_RECORD_NOT_FOUND'] . ': ' . $record . ' ' . $module, -1);
787+
throw new AppException($app_strings['LBL_RECORD_NOT_FOUND'] . ': ' . $record . ' ' . $module, -1);
782788
} else {
783789
$resultrow = $adb->query_result_rowdata($result);
784790
if (!empty($resultrow['deleted'])) {
785-
throw new Exception($app_strings['LBL_RECORD_DELETE'] . ': ' . $record . ' ' . $module, 1);
791+
throw new AppException($app_strings['LBL_RECORD_DELETE'] . ': ' . $record . ' ' . $module, 1);
786792
;
787793
}
788794
foreach ($cachedModuleFields as $fieldinfo) {
@@ -1156,24 +1162,23 @@ function unlinkDependencies($module, $id)
11561162
{
11571163
$log = vglobal('log');
11581164

1159-
$fieldRes = $this->db->pquery('SELECT tabid, tablename, columnname FROM vtiger_field WHERE fieldid IN (
1160-
SELECT fieldid FROM vtiger_fieldmodulerel WHERE relmodule=?)', array($module));
1161-
$numOfFields = $this->db->num_rows($fieldRes);
1162-
for ($i = 0; $i < $numOfFields; $i++) {
1163-
$tabId = $this->db->query_result($fieldRes, $i, 'tabid');
1164-
$tableName = $this->db->query_result($fieldRes, $i, 'tablename');
1165-
$columnName = $this->db->query_result($fieldRes, $i, 'columnname');
1165+
$result = $this->db->pquery('SELECT tabid, tablename, columnname FROM vtiger_field WHERE fieldid IN (
1166+
SELECT fieldid FROM vtiger_fieldmodulerel WHERE relmodule=?)', [$module]);
1167+
1168+
while ($row = $this->db->fetch_array($result)) {
1169+
$tabId = $row['tabid'];
1170+
$tableName = $row['tablename'];
1171+
$columnName = $row['columnname'];
11661172

11671173
$relatedModule = vtlib_getModuleNameById($tabId);
11681174
$focusObj = CRMEntity::getInstance($relatedModule);
11691175

11701176
//Backup Field Relations for the deleted entity
1171-
$targetTableColumn = $focusObj->table_index;
1177+
$targetTableColumn = $focusObj->tab_name_index[$tableName];
11721178
//While deleting product record the $targetTableColumn should 'id'.
11731179
if ($tableName == 'vtiger_inventoryproductrel') {
11741180
$targetTableColumn = 'id';
11751181
}
1176-
11771182
$relQuery = "SELECT $targetTableColumn FROM $tableName WHERE $columnName=?";
11781183
$relResult = $this->db->pquery($relQuery, array($id));
11791184
$numOfRelRecords = $this->db->num_rows($relResult);
@@ -2391,7 +2396,7 @@ function getUserAccessConditionsQuery($module, $user)
23912396
return $query;
23922397
}
23932398

2394-
function getUserAccessConditionsQuerySR($module, $current_user = false)
2399+
function getUserAccessConditionsQuerySR($module, $current_user = false, $relatedRecord = false)
23952400
{
23962401
if ($current_user == false)
23972402
$current_user = vglobal('current_user');
@@ -2403,6 +2408,25 @@ function getUserAccessConditionsQuerySR($module, $current_user = false)
24032408
$query = '';
24042409
$tabId = getTabid($module);
24052410

2411+
if ($relatedRecord) {
2412+
$role = getRoleInformation($current_user->roleid);
2413+
if ($role['listrelatedrecord'] != 0) {
2414+
$rparentRecord = Users_Privileges_Model::getParentRecord($relatedRecord, false, $role['listrelatedrecord']);
2415+
if ($rparentRecord) {
2416+
$relatedRecord = $rparentRecord;
2417+
}
2418+
2419+
$recordMetaData = Vtiger_Functions::getCRMRecordMetadata($relatedRecord);
2420+
$recordPermission = Users_Privileges_Model::isPermitted($recordMetaData['setype'], 'DetailView', $relatedRecord);
2421+
if (!$recordPermission) {
2422+
throw new AppException('LBL_PERMISSION_DENIED');
2423+
}
2424+
if ($recordMetaData['smownerid'] == $current_user->id) {
2425+
return '';
2426+
}
2427+
}
2428+
}
2429+
24062430
if ($is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[$tabId] == 3) {
24072431
$securityParameter = $this->getUserAccessConditionsQuery($module, $current_user);
24082432
foreach (array_merge([$current_user->id], $current_user_groups) as $id) {

0 commit comments

Comments
 (0)