Merge branch 'master' into feature-24647/Konfigurierbare_Dashboards_api

- mv dbchanges from system/dbupdate_3.3.php to system/dbupdate_3.4.php
- mv dbchanges include file from system/dashboard/ to system/dbupdate_3.4/ and prevent direct script access
This commit is contained in:
Harald Bamberger
2022-11-03 10:41:56 +01:00
127 changed files with 3957 additions and 1348 deletions
+118 -169
View File
@@ -50,62 +50,57 @@ class DmsLib
$kategorie_kurzbz = null, $dokument_kurzbz = null, $beschreibung = null, $cis_suche = false, $schlagworte = null
)
{
// write file with content of fileHandle
$writeFileResult = $this->_writeNewFile($name, $fileHandle);
// create unique filename, using original document name to detect file extension
$filename = $this->_getUniqueFilename($name);
if (isError($writeFileResult)) return $writeFileResult;
// copy file from fileHandle to dms folder
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (hasData($writeFileResult))
if (isError($copyFileResult)) return $copyFileResult;
// if file written successful, insert dms
$dmsResult = $this->_ci->DmsModel->insert(
array(
'kategorie_kurzbz' => $kategorie_kurzbz,
'dokument_kurzbz' => $dokument_kurzbz
)
);
if (isError($dmsResult)) return $dmsResult;
if (hasData($dmsResult))
{
$writeFileData = getData($writeFileResult);
$filename = $writeFileData->filename;
$dms_id = getData($dmsResult);
$version = 0;
// if file written successful, insert dms
$dmsResult = $this->_ci->DmsModel->insert(
array(
'kategorie_kurzbz' => $kategorie_kurzbz,
'dokument_kurzbz' => $dokument_kurzbz
)
// insert dms version
$dmsVersion = array(
'dms_id' => $dms_id,
'version' => $version,
'filename' => $filename,
'mimetype' => $mimetype,
'name' => $name,
'beschreibung' => $beschreibung,
'cis_suche' => $cis_suche,
'schlagworte' => $schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
if (isError($dmsResult)) return $dmsResult;
$dmsVersionResult = $this->_ci->DmsVersionModel->insert($dmsVersion);
if (hasData($dmsResult))
{
$dms_id = getData($dmsResult);
$version = 0;
if (isError($dmsVersionResult)) return $dmsVersionResult;
// insert dms version
$dmsVersion = array(
'dms_id' => $dms_id,
'version' => $version,
'filename' => $filename,
'mimetype' => $mimetype,
'name' => $name,
'beschreibung' => $beschreibung,
'cis_suche' => $cis_suche,
'schlagworte' => $schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
// return dms info
$resObj = new stdClass();
$resObj->dms_id = $dms_id;
$resObj->version = $version;
$resObj->filename = $filename;
$dmsVersionResult = $this->_ci->DmsVersionModel->insert($dmsVersion);
if (isError($dmsVersionResult)) return $dmsVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->dms_id = $dms_id;
$resObj->version = $version;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("error when inserting DMS");
return success($resObj);
}
else
return error("file could not be written");
return error("error when inserting DMS");
}
/**
@@ -125,46 +120,41 @@ class DmsLib
$originalName = isset($name) ? $name : $lastVersion->name;
// write new file with content of fileHandle
$writeFileResult = $this->_writeNewFile($originalName, $fileHandle);
// create unique filename, using original document name to detect file extension
$filename = $this->_getUniqueFilename($originalName);
if (isError($writeFileResult)) return $writeFileResult;
// copy file from fileHandle to dms folder
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (hasData($writeFileResult))
{
$writeFileData = getData($writeFileResult);
$filename = $writeFileData->filename;
if (isError($copyFileResult)) return $copyFileResult;
// insert new version
$newVersionNumber = $lastVersion->version + 1;
// insert new version
$newVersionNumber = $lastVersion->version + 1;
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'dms_id' => $dms_id,
'name' => $originalName,
'filename' => $filename,
'version' => $newVersionNumber,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'dms_id' => $dms_id,
'name' => $originalName,
'filename' => $filename,
'version' => $newVersionNumber,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
'insertvon' => $this->_who,
'insertamum' => date('Y-m-d H:i:s')
);
$addVersionResult = $this->_ci->DmsVersionModel->insert($newVersion);
$addVersionResult = $this->_ci->DmsVersionModel->insert($newVersion);
if (isError($addVersionResult)) return $addVersionResult;
if (isError($addVersionResult)) return $addVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->version = $newVersionNumber;
$resObj->filename = $filename;
// return dms info
$resObj = new stdClass();
$resObj->version = $newVersionNumber;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("file could not be written");
return success($resObj);
}
else
return error("last version not found");
@@ -185,44 +175,37 @@ class DmsLib
if (hasData($lastVersionResult))
{
$lastVersion = getData($lastVersionResult);
$filename = $lastVersion->filename;
// update file in filesystem
$writeFileResult = $this->_writeFile($lastVersion->filename, $fileHandle);
$copyFileResult = $this->_copyFile($fileHandle, $filename);
if (isError($writeFileResult)) return $writeFileResult;
if (isError($copyFileResult)) return $copyFileResult;
if (hasData($writeFileResult))
{
$writeFileData = getData($writeFileResult);
$filename = $writeFileData->filename;
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'name' => isset($name) ? $name : $lastVersion->name,
'filename' => $filename,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
);
// if new parameters given, use them, otherwise use parameters from last version
$newVersion = array(
'name' => isset($name) ? $name : $lastVersion->name,
'filename' => $filename,
'mimetype' => isset($mimetype) ? $mimetype : $lastVersion->mimetype,
'beschreibung' => isset($beschreibung) ? $beschreibung : $lastVersion->beschreibung,
'cis_suche' => isset($cis_suche) ? $cis_suche : $lastVersion->cis_suche,
'schlagworte' => isset($schlagworte) ? $schlagworte : $lastVersion->schlagworte,
);
// update last dms version
$addVersionResult = $this->_ci->DmsVersionModel->update(
array($dms_id, $lastVersion->version),
$newVersion
);
// update last dms version
$addVersionResult = $this->_ci->DmsVersionModel->update(
array($dms_id, $lastVersion->version),
$newVersion
);
if (isError($addVersionResult)) return $addVersionResult;
if (isError($addVersionResult)) return $addVersionResult;
// return dms info
$resObj = new stdClass();
$resObj->version = $lastVersion->version;
$resObj->filename = $filename;
// return dms info
$resObj = new stdClass();
$resObj->version = $lastVersion->version;
$resObj->filename = $filename;
return success($resObj);
}
else
return error("file could not be written");
return success($resObj);
}
else
return error("last version not found");
@@ -441,68 +424,35 @@ class DmsLib
// Private methods
/**
* Writes file with content of fileHandle using original document name for file extension
* Copies file from sourceFileHandle to destinationFilename in DMS folder
* Returns success or error on fail
*/
private function _writeNewFile($originalName, $fileHandle)
private function _copyFile($sourceFileHandle, $destinationFilename)
{
// create unique filename, using original document name to detect file extension
$filename = $this->_getUniqueFilename($originalName);
// get file location from file handle
$metaData = stream_get_meta_data($sourceFileHandle);
// write the file
return $this->_writeFile($filename, $fileHandle);
}
/**
* Writes file with content of fileHandle
* Returns number of bytes written and filename
*/
private function _writeFile($filename, $fileHandle)
{
// file content provided by fileHandle
$fileContent = '';
$readBlockResult = success();
// While the end of the file is not reached and the read does not fail
while (!feof($fileHandle) && isSuccess($readBlockResult = $this->_ci->DmsFSModel->readBlock($fileHandle)))
if (isset($metaData['uri']) && !isEmptyString($metaData['uri']))
{
// Concatenate the content of the file
$fileContent .= getData($readBlockResult);
// if file location determined, copy file
$source = $metaData['uri'];
if (copy($source, DMS_PATH.$destinationFilename))
{
return success();
}
else
{
// error if copy returned false
return error('error occured while copying file');
}
}
// If an error occurred while reading then return it
if (isError($readBlockResult)) return $readBlockResult;
// open file for writing
$openFileResult = $this->_ci->DmsFSModel->openReadWrite($filename);
if (isError($openFileResult)) return $openFileResult;
if (!hasData($openFileResult)) return error("File could not be opened");
$newFileHandle = getData($openFileResult);
// write file
$writeFileResult = $this->_ci->DmsFSModel->write($newFileHandle, $fileContent);
if (isError($writeFileResult)) return $writeFileResult;
// return number of bytes written and filename
$resObj = new stdClass();
$resObj->bytesWritten = 0;
$resObj->filename = '';
if (hasData($writeFileResult))
else
{
$resObj->bytesWritten = getData($writeFileResult);
$resObj->filename = $filename;
// error when source location could not be determined
return error('error occured while getting source file name');
}
// close handle
$closeResult = $this->_ci->DmsFSModel->close($newFileHandle, $fileContent);
if (isError($closeResult)) return $closeResult;
return success($resObj);
}
@@ -527,7 +477,7 @@ class DmsLib
// -----------------------------------------------------------------------------------------------------------
// Deprecated methods, not to be used
/**
* Load a DMS Document.
* If no version is particularly given, the latest version is loaded.
@@ -543,7 +493,7 @@ class DmsLib
$this->_ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
$this->_ci->DmsModel->addOrder('version', 'DESC');
$this->_ci->DmsModel->addLimit(1);
if (!is_numeric($version))
{
return $this->_ci->DmsModel->load($dms_id);
@@ -620,7 +570,7 @@ class DmsLib
return $result;
}
/**
* Uploads a document and saves it to DMS
* @param $dms DMS assoc array
@@ -659,7 +609,7 @@ class DmsLib
// Return result of uploaded data
return success($upload_data);
}
/**
* Download a document.
*
@@ -678,7 +628,7 @@ class DmsLib
if (hasData($fileInfoResult))
{
$fileObj = getData($fileInfoResult);
// Change filename, if filename is provided
if (!isEmptyString($filename)) $fileObj->name = $filename;
@@ -694,7 +644,7 @@ class DmsLib
// If no data have been found then return an empty success
return success();
}
/**
* Get file information.
*
@@ -706,7 +656,7 @@ class DmsLib
{
// Checks the dms_id parameter
if (!is_numeric($dms_id)) return error('Wrong parameter');
// Load DMS from database
$result = $this->load($dms_id, $version);
if (isError($result)) return error(getError($result));
@@ -951,4 +901,3 @@ class DmsLib
$this->_ci->upload->initialize($config);
}
}
+1 -1
View File
@@ -454,7 +454,7 @@ class ExtensionsLib
require_once('version.php'); // get the core version
// Checks if the required core version of the extension is the same of this system
if (isset($extensionJson->core_version) && $extensionJson->core_version == $fhcomplete_version)
if (isset($extensionJson->core_version) && version_compare($extensionJson->core_version, $fhcomplete_version,'<='))
{
$this->_printMessage('Required core version: '.$extensionJson->core_version);
$this->_printMessage('Current core version: '.$fhcomplete_version);
+27 -94
View File
@@ -271,95 +271,6 @@ class FilterCmptLib
$this->_setSessionElement(FilterCmptLib::SESSION_TIMEOUT, strtotime('+'.$this->_sessionTimeout.' minutes', time()));
}
/**
* Change the sort of the selected fields of the current filter
*/
public function sortSelectedFields($selectedFields)
{
$sortSelectedFields = false;
// Checks the parameter selectedFields
if (isset($selectedFields) && is_array($selectedFields) && count($selectedFields) > 0)
{
// Retrieves all the used fields by the current filter
$fields = $this->_getSessionElement(self::SESSION_FIELDS);
// Checks that the given selected fields are present in all the used fields by the current filter
if (!array_diff($selectedFields, $fields))
{
$this->_setSessionElement(self::SESSION_SELECTED_FIELDS, $selectedFields); // write changes into the session
$sortSelectedFields = true;
}
}
return $sortSelectedFields;
}
/**
* Add a field to the current filter
*/
public function addSelectedField($selectedField)
{
$removeSelectedField = false;
// Checks the parameter selectedField
if (!isEmptyString($selectedField))
{
// Retrieves all the used fields by the current filter
$fields = $this->_getSessionElement(self::SESSION_FIELDS);
// Retrieves the selected fields by the current filter
$selectedFields = $this->_getSessionElement(self::SESSION_SELECTED_FIELDS);
// Checks that the given selected field is present in the list of all the used fields by the current filter
if (in_array($selectedField, $fields))
{
array_push($selectedFields, $selectedField); // place the new filed at the end of the selected fields list
$this->_setSessionElement(self::SESSION_SELECTED_FIELDS, $selectedFields); // write changes into the session
$removeSelectedField = true;
}
}
return $removeSelectedField;
}
/**
* Remove a selected field from the current filter
*/
public function removeSelectedField($selectedField)
{
$removeSelectedField = false;
// Checks the parameter selectedField
if (!isEmptyString($selectedField))
{
// Retrieves all the used fields by the current filter
$fields = $this->_getSessionElement(self::SESSION_FIELDS);
// Retrieves the selected fields by the current filter
$selectedFields = $this->_getSessionElement(self::SESSION_SELECTED_FIELDS);
// Checks that the given selected field is present in the list of all the used fields by the current filter
if (in_array($selectedField, $fields))
{
// If the selected field is present in the list of the selected fields by the current filter
$pos = array_search($selectedField, $selectedFields);
if ($pos !== false)
{
// Then remove it and shift the rest of elements by one if needed
array_splice($selectedFields, $pos, 1);
}
$this->_setSessionElement(self::SESSION_SELECTED_FIELDS, $selectedFields); // write changes into the session
$removeSelectedField = true;
}
}
return $removeSelectedField;
}
/**
* Add a filter (SQL where clause) to be applied to the current filter
*/
@@ -593,6 +504,12 @@ class FilterCmptLib
$saveCustomFilter = true;
}
if ($saveCustomFilter === true)
{
$this->_setSessionElement(FilterCmptLib::SESSION_SIDE_MENU,
$this->_generateFilterMenu($this->_app, $this->_datasetName));
}
return $saveCustomFilter;
}
@@ -659,7 +576,7 @@ class FilterCmptLib
}
else // otherwise
{
$menuEntry->subscriptDescription = 'Remove';
$menuEntry->subscriptDescription = '(Remove)';
$menuEntry->subscriptLinkClass = 'remove-custom-filter';
$menuEntry->subscriptLinkValue = $filter->{self::FILTER_ID};
@@ -851,15 +768,31 @@ class FilterCmptLib
{
// comparison (==)
case self::OP_EQUAL:
if (is_numeric($filterDefinition->condition)) $condition = '= '.$filterDefinition->condition;
// Numeric
if (is_numeric($filterDefinition->condition))
{
$condition = '= '.$filterDefinition->condition;
}
else // string type
{
$condition = '= \''.$this->_ci->FiltersModel->escapeLike($filterDefinition->condition).'\'';
}
break;
// not equal (!=)
case self::OP_NOT_EQUAL:
if (is_numeric($filterDefinition->condition)) $condition = '!= '.$filterDefinition->condition;
// Numeric
if (is_numeric($filterDefinition->condition))
{
$condition = '!= '.$filterDefinition->condition;
}
else // string type
{
$condition = '!= \''.$this->_ci->FiltersModel->escapeLike($filterDefinition->condition).'\'';
}
break;
// greater than (>)
case self::OP_GREATER_THAN:
// It it's a date type
// If it's a date type
if (is_numeric($filterDefinition->condition)
&& isset($filterDefinition->option)
&& ($filterDefinition->option == self::OPT_HOURS
@@ -876,7 +809,7 @@ class FilterCmptLib
break;
// less than (<)
case self::OP_LESS_THAN:
// It it's a date type
// If it's a date type
if (is_numeric($filterDefinition->condition)
&& isset($filterDefinition->option)
&& ($filterDefinition->option == self::OPT_HOURS
+15 -10
View File
@@ -340,20 +340,25 @@ class FilterWidgetLib
{
$filterDefinition = $filters[$filtersCounter]; // definition of one filter
if ($filtersCounter > 0)
$where .= ' AND '; // if it's NOT the last one
if (!isEmptyString($filterDefinition->name)) // if the name of the applied filter is valid
// If the name of the applied filter is valid
if (!isEmptyString($filterDefinition->name))
{
// ...build the condition
$where .= '"'.$filterDefinition->name.'"'.$this->_getDatasetQueryCondition($filterDefinition);
// Build the query conditions
$datasetQueryCondition = $this->_getDatasetQueryCondition($filterDefinition);
// If the built condition is valid then add it to the query clause
if (!isEmptyString($datasetQueryCondition))
{
// // If this is NOT the first one
if ($filtersCounter > 0) $where .= ' AND ';
$where .= '"'.$filterDefinition->name.'"'.$datasetQueryCondition;
}
}
}
if ($where != '') // if the SQL where clause was built
{
$datasetQuery .= ' WHERE '.$where;
}
// If the SQL where clause was built
if ($where != '') $datasetQuery .= ' WHERE '.$where;
}
return $datasetQuery;
+15 -3
View File
@@ -122,11 +122,21 @@ class SearchBarLib
p.person_id AS person_id,
p.vorname || \' \' || p.nachname AS name,
ARRAY_AGG(DISTINCT(org.bezeichnung)) AS organisationunit_name,
b.uid || \''.'@'.DOMAIN.'\' AS email,
COALESCE(b.alias, b.uid) || \''.'@'.DOMAIN.'\' AS email,
TRIM(COALESCE(k.kontakt, \'\') || \' \' || COALESCE(m.telefonklappe, \'\')) AS phone,
\''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url
\''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url,
ARRAY_AGG(DISTINCT(stdkst.bezeichnung)) AS standardkostenstelle
FROM public.tbl_mitarbeiter m
JOIN public.tbl_benutzer b ON(b.uid = m.mitarbeiter_uid)
JOIN (
SELECT o.bezeichnung, bf.uid
FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_organisationseinheit o USING(oe_kurzbz)
WHERE bf.funktion_kurzbz = \'kstzuordnung\'
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, bf.uid
) stdkst ON stdkst.uid = b.uid
JOIN public.tbl_person p USING(person_id)
JOIN (
SELECT o.bezeichnung, bf.uid
@@ -136,7 +146,7 @@ class SearchBarLib
AND (bf.datum_von IS NULL OR bf.datum_von <= NOW())
AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW())
GROUP BY o.bezeichnung, bf.uid
) org USING(uid)
) org ON org.uid = b.uid
LEFT JOIN (
SELECT kontakt, standort_id
FROM public.tbl_kontakt
@@ -145,6 +155,8 @@ class SearchBarLib
WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR org.bezeichnung ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
OR stdkst.bezeichnung ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
GROUP BY type, b.uid, p.person_id, name, email, m.telefonklappe, phone
');