.
*/
/**
* @brief Contains the docservers_controler Object
* (herits of the BaseObject class)
*
* @file
* @author Luc KEULEYAN - BULL
* @author Laurent Giovannoni
* @date $date$
* @version $Revision$
* @ingroup core
*/
//Loads the required class
try {
require_once 'core/class/class_request.php';
require_once 'core/class/docservers.php';
require_once 'core/docservers_tools.php';
require_once 'core/core_tables.php';
require_once 'core/class/ObjectControlerAbstract.php';
require_once 'core/class/ObjectControlerIF.php';
require_once 'core/class/class_security.php';
require_once 'core/class/class_resource.php';
require_once 'core/class/class_history.php';
} catch (Exception $e) {
echo $e->getMessage() . ' // ';
}
/**
* Class for controling docservers objects from database
*/
class docservers_controler
extends ObjectControler
implements ObjectControlerIF
{
/**
* Save given object in database:
* - make an update if object already exists,
* - make an insert if new object.
* Return updated object.
* @param docservers $docservers
* @return array
*/
public function save($docserver, $mode='')
{
//var_dump($docserver);
$control = array();
if (!isset($docserver) || empty($docserver)) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_EMPTY,
);
return $control;
}
$docserver = $this->isADocserver($docserver);
$this->set_foolish_ids(
array(
'docserver_id',
'docserver_type_id',
'coll_id',
'docserver_location_id',
)
);
$this->set_specific_id('docserver_id');
if ($mode == 'up') {
$control = $this->control($docserver, 'up');
if ($control['status'] == 'ok') {
//Update existing docserver
if ($this->update($docserver)) {
$this->createPackageInformation($docserver);
$control = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
//history
if ($_SESSION['history']['docserversadd'] == 'true') {
$history = new history();
$history->add(
_DOCSERVERS_TABLE_NAME,
$docserver->docserver_id,
'UP','docserversadd',
_DOCSERVER_UPDATED . ' : '
. $docserver->docserver_id,
$_SESSION['config']['databasetype']
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _PB_WITH_DOCSERVER,
);
}
return $control;
}
} else {
$control = $this->control($docserver, 'add');
if ($control['status'] == 'ok') {
//Insert new docserver
if ($this->insert($docserver)) {
$this->createPackageInformation($docserver);
$control = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
//history
if ($_SESSION['history']['docserversadd'] == 'true') {
$history = new history();
$history->add(
_DOCSERVERS_TABLE_NAME,
$docserver->docserver_id,
'ADD','docserversadd',
_DOCSERVER_ADDED . ' : ' . $docserver->docserver_id,
$_SESSION['config']['databasetype']
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _PB_WITH_DOCSERVER,
);
}
}
}
return $control;
}
/**
* control the docserver object before action
*
* @param $docserver docserver object
* @return array ok if the object is well formated, ko otherwise
*/
private function control($docserver, $mode)
{
$f = new functions();
$error = '';
if ($mode == 'add') {
// Update, so values exist
if (isset($docserver->docserver_id)
&& $docserver->docserver_id <> ''
) {
$docserver->docserver_id = $f->protect_string_db(
$f->wash(
$docserver->docserver_id,
'nick',
_DOCSERVER_ID . ' ',
'yes', 0, 32
)
);
} else {
$error .= _DOCSERVER_ID . ' ' . _IS_EMPTY . '#';
}
}
$docserver->docserver_type_id = $f->protect_string_db(
$f->wash(
$docserver->docserver_type_id,
'no',
_DOCSERVER_TYPES . ' ',
'yes',
0,
32
)
);
$docserver->device_label = $f->protect_string_db(
$f->wash(
$docserver->device_label,
'no',
_DEVICE_LABEL . ' ',
'yes',
0,
255
)
);
if ($docserver->is_readonly == '') {
$docserver->is_readonly = 'false';
}
$docserver->is_readonly = $f->protect_string_db(
$f->wash(
$docserver->is_readonly,
'no',
_IS_READONLY . ' ',
'yes',
0,
5
)
);
if ($docserver->is_readonly == 'false') {
$docserver->is_readonly = false;
} else {
$docserver->is_readonly = true;
}
if (isset($docserver->size_limit_number)
&& !empty($docserver->size_limit_number)
) {
$docserver->size_limit_number = $f->protect_string_db(
$f->wash(
$docserver->size_limit_number,
'no',
_SIZE_LIMIT . ' ',
'yes',
0,
255
)
);
if ($docserver->size_limit_number == 0) {
$error .= _SIZE_LIMIT . ' ' . _IS_EMPTY . '#';
}
if ($this->sizeLimitControl($docserver)) {
$error .= _SIZE_LIMIT_UNAPPROACHABLE . '#';
}
if ($this->actualSizeNumberControl($docserver)) {
$error .= _SIZE_LIMIT_LESS_THAN_ACTUAL_SIZE . '#';
}
} else {
$error .= _SIZE_LIMIT . ' ' . _IS_EMPTY . '#';
}
$docserver->path_template = $f->protect_string_db(
$f->wash(
$docserver->path_template,
'no',
_PATH_TEMPLATE . ' ',
'yes',
0,
255
)
);
if (!is_dir($docserver->path_template)) {
$error .= _PATH_OF_DOCSERVER_UNAPPROACHABLE . '#';
} else {
// $Fnm = $docserver->path_template . 'test_docserver.txt';
if (!is_writable($docserver->path_template)
|| !is_readable($docserver->path_template)
) {
$error .= _THE_DOCSERVER_DOES_NOT_HAVE_THE_ADEQUATE_RIGHTS;
}
}
$docserver->coll_id = $f->protect_string_db(
$f->wash(
$docserver->coll_id,
'no',
_COLLECTION . ' ',
'yes',
0,
32
)
);
$docserver->priority_number = $f->protect_string_db(
$f->wash(
$docserver->priority_number,
'num',
_PRIORITY . ' ',
'yes',
0,
6
)
);
$docserver->docserver_location_id = $f->protect_string_db(
$f->wash(
$docserver->docserver_location_id,
'no',
_DOCSERVER_LOCATIONS . ' ',
'yes',
0,
32
)
);
$docserver->adr_priority_number = $f->protect_string_db(
$f->wash(
$docserver->adr_priority_number,
'num',
_ADR_PRIORITY . ' ',
'yes',
0,
6
)
);
if ($mode == 'add'
&& $this->docserversExists($docserver->docserver_id)
) {
$error .= $docserver->docserver_id . ' ' . _ALREADY_EXISTS . '#';
}
if (!$this->adrPriorityNumberControl($docserver)) {
$error .= _PRIORITY . ' ' . $docserver->adr_priority_number . ' '
. _ALREADY_EXISTS_FOR_THIS_TYPE_OF_DOCSERVER . '#';
}
if (!$this->priorityNumberControl($docserver)) {
$error .= _ADR_PRIORITY . $docserver->priority_number . ' '
. _ALREADY_EXISTS_FOR_THIS_TYPE_OF_DOCSERVER . '#';
}
$error .= $_SESSION['error'];
//TODO:rewrite wash to return errors without html
$error = str_replace('
', '#', $error);
$return = array();
if (!empty($error)) {
$return = array(
'status' => 'ko',
'value' => $docserver->docserver_id,
'error' => $error,
);
} else {
$return = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
}
return $return;
}
/**
* method to create package information file on the root of the docserver
*
* @param $docserver docserver object
*/
private function createPackageInformation($docserver)
{
if (is_writable($docserver->path_template)
&& is_readable($docserver->path_template)
) {
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_types_controler.php');
$docserverTypeControler = new docserver_types_controler();
$docserverTypeObject = $docserverTypeControler->get(
$docserver->docserver_type_id
);
$Fnm = $docserver->path_template . DIRECTORY_SEPARATOR
. 'package_information';
if (file_exists($Fnm)) {
unlink($Fnm);
}
$inF = fopen($Fnm, 'a');
fwrite(
$inF,
_DOCSERVER_TYPE_ID . ' : '
. $docserverTypeObject->docserver_type_id . '\r\n'
);
fwrite(
$inF,
_DOCSERVER_TYPE_LABEL . ' : '
. $docserverTypeObject->docserver_type_label . '\r\n'
);
fwrite(
$inF,
_IS_CONTAINER . ' : ' . $docserverTypeObject->is_container
. '\r\n'
);
fwrite(
$inF,
_CONTAINER_MAX_NUMBER . ' : '
. $docserverTypeObject->container_max_number . '\r\n'
);
fwrite(
$inF,
_IS_COMPRESSED . ' : ' . $docserverTypeObject->is_compressed
. '\r\n'
);
fwrite(
$inF,
_COMPRESS_MODE . ' : '
. $docserverTypeObject->compression_mode . '\r\n'
);
fwrite(
$inF,
_IS_META . ' : ' . $docserverTypeObject->is_meta . '\r\n'
);
fwrite(
$inF,
_META_TEMPLATE . ' : ' . $docserverTypeObject->meta_template
. '\r\n'
);
fwrite(
$inF,
_IS_LOGGED . ' : ' . $docserverTypeObject->is_logged . '\r\n'
);
fwrite(
$inF,
_LOG_TEMPLATE . ' : ' . $docserverTypeObject->log_template
. '\r\n'
);
fwrite(
$inF,
_IS_SIGNED . ' : ' . $docserverTypeObject->is_signed . '\r\n'
);
fwrite(
$inF,
_FINGERPRINT_MODE . ' : '
. $docserverTypeObject->fingerprint_mode . '\r\n'
);
fclose($inF);
}
}
/**
* Inserts in the database (docservers table) a docserver object
*
* @param $docserver docserver object
* @return bool true if the insertion is complete, false otherwise
*/
private function insert($docserver)
{
$request = new request();
//Giving automatised values
$docserver->enabled = 'Y';
$docserver->creation_date = $request->current_datetime();
//Inserting object
$result = $this->advanced_insert($docserver);
return $result;
}
/**
* Updates in the database (docserver table) a docservers object
*
* @param $docserver docserver object
* @return bool true if the update is complete, false otherwise
*/
private function update($docserver)
{
return $this->advanced_update($docserver);
}
/**
* Get docservers with given id.
* Can return null if no corresponding object.
* @param $id Id of docservers to get
* @return docservers
*/
public function get($docserver_id)
{
//var_dump($docserver_id);
$this->set_foolish_ids(array('docserver_id'));
$this->set_specific_id('docserver_id');
$docserver = $this->advanced_get($docserver_id, _DOCSERVERS_TABLE_NAME);
//var_dump($docserver);
if (get_class($docserver) <> 'docservers') {
return null;
} else {
//var_dump($docserver);
return $docserver;
}
}
/**
* get docservers with given id for a ws.
* Can return null if no corresponding object.
* @param $docserver_id of docservers to send
* @return docservers
*/
public function getWs($docserver_id)
{
$this->set_foolish_ids(array('docserver_id'));
$this->set_specific_id('docserver_id');
$docserver = $this->advanced_get($docserver_id, _DOCSERVERS_TABLE_NAME);
if (get_class($docserver) <> 'docservers') {
return null;
} else {
$docserver = $docserver->getArray();
return $docserver;
}
}
/**
* Delete given docserver from database.
* @param docservers $docservers
*/
public function delete($docserver)
{
if ($docserver->docserver_id <> 'TEMPLATES') {
$func = new functions();
$control = array();
if (!isset($docserver) || empty($docserver)) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_EMPTY,
);
return $control;
}
$docserver = $this->isADocserver($docserver);
if (!$this->docserversExists($docserver->docserver_id)) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_NOT_EXISTS,
);
return $control;
}
if ($this->adrxLinkExists(
$docserver->docserver_id,
$docserver->coll_id
)
) {
$control = array('status' => 'ko', 'value' => '',
'error' => _DOCSERVER_ATTACHED_TO_ADR_X);
return $control;
}
if ($this->resxLinkExists(
$docserver->docserver_id,
$docserver->coll_id
)
) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_ATTACHED_TO_RES_X,
);
return $control;
}
$db = new dbquery();
$db->connect();
$query = "delete from " . _DOCSERVERS_TABLE_NAME
. " where docserver_id ='"
. $func->protect_string_db($docserver->docserver_id) . "'";
try {
$db->query($query);
} catch (Exception $e) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _CANNOT_DELETE_DOCSERVER_ID
. ' ' . $docserver->docserver_id,
);
}
$db->disconnect();
$control = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
if ($_SESSION['history']['docserversdel'] == 'true') {
$history = new history();
$history->add(
_DOCSERVERS_TABLE_NAME,
$docserver->docserver_id,
'DEL','docserversdel',
_DOCSERVER_DELETED . ' : ' . $docserver->docserver_id,
$_SESSION['config']['databasetype']
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _CANNOT_DELETE_DOCSERVER_ID
. ' ' . $docserver->docserver_id,
);
}
return $control;
}
/**
* Disables a given docservers
*
* @param $docserver docservers object
* @return bool true if the disabling is complete, false otherwise
*/
public function disable($docserver)
{
if ($docserver->docserver_id <> 'TEMPLATES') {
$control = array();
if (!isset($docserver) || empty($docserver)) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_EMPTY,
);
return $control;
}
$docserver = $this->isADocserver($docserver);
$this->set_foolish_ids(array('docserver_id'));
$this->set_specific_id('docserver_id');
if ($this->advanced_disable($docserver)) {
$control = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
if ($_SESSION['history']['docserversban'] == 'true') {
$history = new history();
$history->add(
_DOCSERVERS_TABLE_NAME,
$docserver->docserver_id,
'BAN','docserversban',
_DOCSERVER_DISABLED . ' : ' . $docserver->docserver_id,
$_SESSION['config']['databasetype']
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _PB_WITH_DOCSERVER,
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _CANNOT_SUSPEND_DOCSERVER . ' ' . $docserver->docserver_id,
);
}
return $control;
}
/**
* Enables a given docserver
*
* @param $docserver docservers object
* @return bool true if the enabling is complete, false otherwise
*/
public function enable($docserver)
{
$control = array();
if (!isset($docserver) || empty($docserver)) {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _DOCSERVER_EMPTY,
);
return $control;
}
$docserver = $this->isADocserver($docserver);
$this->set_foolish_ids(array('docserver_id'));
$this->set_specific_id('docserver_id');
if ($this->advanced_enable($docserver)) {
$control = array(
'status' => 'ok',
'value' => $docserver->docserver_id,
);
if ($_SESSION['history']['docserversallow'] == 'true') {
$history = new history();
$history->add(
_DOCSERVERS_TABLE_NAME,
$docserver->docserver_id,
'VAL','docserversallow',
_DOCSERVER_ENABLED . ' : ' . $docserver->docserver_id,
$_SESSION['config']['databasetype']
);
}
} else {
$control = array(
'status' => 'ko',
'value' => '',
'error' => _PB_WITH_DOCSERVER,
);
}
return $control;
}
/**
* Fill a docserver object with an object if it's not a docserver
*
* @param $object ws docserver object
* @return object docservers
*/
private function isADocserver($object)
{
if (get_class($object) <> 'docservers') {
$func = new functions();
$docserverObject = new docservers();
$array = array();
$array = $func->object2array($object);
foreach (array_keys($array) as $key) {
$docserverObject->$key = $array[$key];
}
return $docserverObject;
} else {
return $object;
}
}
/**
* Test if a given docserver exists
*
* @param $docserver docservers object
* @return bool true if exists, false otherwise
*/
public function docserversExists($docserver_id)
{
if (!isset($docserver_id) || empty($docserver_id)) {
return false;
}
$db = new dbquery();
$db->connect();
$query = "select docserver_id from " . _DOCSERVERS_TABLE_NAME
. " where docserver_id = '" . $docserver_id . "'";
try{
$db->query($query);
} catch (Exception $e) {
echo _UNKNOWN . _DOCSERVER . ' ' . $docserver_id . ' // ';
}
if ($db->nb_result() > 0) {
$db->disconnect();
return true;
}
$db->disconnect();
return false;
}
/**
*Check if the docserver is linked to a ressource
*@param docserver_id docservers
*@return bool true if it's linked
*/
public function resxLinkExists($docserver_id, $coll_id)
{
if ($coll_id == 'templates') {
return false;
}
$security = new security();
$db = new dbquery();
$db->connect();
$tableName = $security->retrieve_table_from_coll($coll_id);
if (!isset($tableName) || empty($tableName)) {
return false;
}
$query = "select docserver_id from " . $tableName
. " where docserver_id = '" . $docserver_id . "'";
$db->query($query);
if ($db->nb_result() > 0) {
$db->disconnect();
return true;
}
$db->disconnect();
return false;
}
/**
*Check if the docserver is linked to a ressource address
*@param docserver_id docservers
*@return bool true if it's linked
*/
public function adrxLinkExists($docserver_id, $coll_id)
{
$security = new security();
$db = new dbquery();
$db->connect();
$adrName = $security->retrieveAdrFromColl($coll_id);
if (!isset($adrName) || empty($adrName)) {
return false;
}
$query = "select docserver_id from " . $adrName
. " where docserver_id = '" . $docserver_id . "'";
$db->query($query);
if ($db->nb_result() > 0) {
$db->disconnect();
return true;
}
$db->disconnect();
}
/**
* Check if two docservers have the same priorities
*
* @param $docserver docservers object
* @return bool true if the control is ok
*/
private function adrPriorityNumberControl($docserver)
{
$func = new functions();
if (!isset($docserver)
|| empty($docserver)
|| empty($docserver->adr_priority_number)
) {
return false;
}
$db = new dbquery();
$db->connect();
$query = "select adr_priority_number from " . _DOCSERVERS_TABLE_NAME
. " where adr_priority_number = "
. $docserver->adr_priority_number
. " AND docserver_type_id = '"
. $func->protect_string_db($docserver->docserver_type_id) . "'"
. " AND docserver_id <> '"
. $func->protect_string_db($docserver->docserver_id) . "'";
$db->query($query);
if ($db->nb_result() > 0) {
$db->disconnect();
return false;
}
$db->disconnect();
return true;
}
/**
* Check if two docservers have the same priorities
*
* @param $docserver docservers object
* @return bool true if the control is ok
*/
private function priorityNumberControl($docserver)
{
$func = new functions();
if (!isset($docserver)
|| empty($docserver)
|| empty($docserver->priority_number)
) {
return false;
}
$db = new dbquery();
$db->connect();
$query = "select priority_number from " . _DOCSERVERS_TABLE_NAME
. " where priority_number = " . $docserver->priority_number
. " AND docserver_type_id = '"
. $func->protect_string_db($docserver->docserver_type_id) . "'"
. " AND docserver_id <> '"
. $func->protect_string_db($docserver->docserver_id) . "'";
$db->query($query);
if ($db->nb_result() > 0) {
$db->disconnect();
return false;
}
$db->disconnect();
return true;
}
/**
* Check if the docserver actual size is less than the size limit
*
* @param $docserver docservers object
* @return bool true if the control is ok
*/
public function actualSizeNumberControl($docserver)
{
if (!isset($docserver) || empty($docserver)) {
return false;
}
$size_limit_number = floatval($docserver->size_limit_number);
$size_limit_number = $size_limit_number * 1000 * 1000 * 1000;
$db = new dbquery();
$db->connect();
$query = "select actual_size_number from " . _DOCSERVERS_TABLE_NAME
. " where docserver_id = '" . $docserver->docserver_id . "'";
$db->query($query);
$queryResult = $db->fetch_object();
if (isset($queryResult->actual_size_number)) {
$actual_size_number = floatval($queryResult->actual_size_number);
} else {
$actual_size_number = 0;
}
$db->disconnect();
if ($size_limit_number < $actual_size_number) {
return true;
} else {
return false;
}
}
/**
* Check if the docserver size has not reached the limit
*
* @param $docserver docservers object
* @return bool true if the control is ok
*/
private function sizeLimitControl($docserver)
{
$docserver->size_limit_number = floatval($docserver->size_limit_number);
$maxsizelimit = floatval(
$_SESSION['docserversFeatures']['DOCSERVERS']['MAX_SIZE_LIMIT']
) * 1000 * 1000 * 1000;
if (!isset($docserver) || empty($docserver)) {
return false;
}
if ($docserver->size_limit_number < $maxsizelimit) {
return false;
} else {
return true;
}
}
/**
* Get docservers to insert a new doc.
* Can return null if no corresponding object.
* @param $coll_id string Collection identifier
* @return docservers
*/
public function getDocserverToInsert($collId)
{
$db = new dbquery();
$db->connect();
$query = "select priority_number, docserver_id from "
. _DOCSERVERS_TABLE_NAME . " where is_readonly = 'N' and "
. " enabled = 'Y' and coll_id = '" . $collId
. "' order by priority_number";
$db->query($query);
$queryResult = $db->fetch_object();
$db->disconnect();
if ($queryResult->docserver_id <> '') {
$docserver = $this->get($queryResult->docserver_id);
if (isset($docserver->docserver_id)) {
return $docserver;
} else {
return null;
}
} else {
return null;
}
}
/**
* Store a new doc in a docserver.
* @param $collId collection resource
* @param $fileInfos infos of the doc to store, contains :
* tmpDir : path to tmp directory
* size : size of the doc
* format : format of the doc
* tmpFileName : file name of the doc in Maarch tmp directory
* @return array of docserver data for res_x else return error
*/
public function storeResourceOnDocserver($collId, $fileInfos)
{
$docserver = $this->getDocserverToInsert($collId);
$tmpSourceCopy = '';
$func = new functions();
if (empty($docserver)) {
$storeInfos = array(
'error' => _DOCSERVER_ERROR . ' : '
. _NO_AVAILABLE_DOCSERVER . ' . ' . _MORE_INFOS . '.',
);
return $storeInfos;
}
$newSize = $this->checkSize($docserver, $fileInfos['size']);
if ($newSize == 0) {
$storeInfos = array(
'error' => _DOCSERVER_ERROR . ' : '
. _NOT_ENOUGH_DISK_SPACE . ' . ' . _MORE_INFOS . '.',
);
return $storeInfos;
}
if ($fileInfos['tmpDir'] == '') {
$tmp = $_SESSION['config']['tmppath'];
} else {
$tmp = $fileInfos['tmpDir'];
}
$d = dir($tmp);
$pathTmp = $d->path;
while ($entry = $d->read()) {
if ($entry == $fileInfos['tmpFileName']) {
$tmpSourceCopy = $pathTmp . $entry;
$theFile = $entry;
break;
}
}
$d->close();
$pathOnDocserver = array();
$pathOnDocserver = Ds_createPathOnDocServer(
$docserver->path_template
);
$docinfo = $this->getNextFileNameInDocserver(
$pathOnDocserver['destinationDir']
);
if ($docinfo['error'] <> '') {
$_SESSION['error'] = _FILE_SEND_ERROR . '. '._TRY_AGAIN . '. '
. _MORE_INFOS . ' : '
. $_SESSION['config']['adminname'] . '';
}
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_types_controler.php');
$docserverTypeControler = new docserver_types_controler();
$docserverTypeObject = $docserverTypeControler->get(
$docserver->docserver_type_id
);
$docinfo['fileDestinationName'] .= '.'
. strtolower($func->extractFileExt($tmpSourceCopy));
$copyResultArray = Ds_copyOnDocserver(
$tmpSourceCopy,
$docinfo,
$docserverTypeObject->fingerprint_mode
);
if (isset($copyResultArray['error']) && $copyResultArray['error'] <> '') {
//second chance
$docinfo = array();
$copyResultArray = array();
$docinfo = $this->getNextFileNameInDocserver(
$pathOnDocserver['destinationDir']
);
if ($docinfo['error'] <> '') {
$_SESSION['error'] = _FILE_SEND_ERROR . '. '._TRY_AGAIN . '. '
. _MORE_INFOS . ' : '
. $_SESSION['config']['adminname'] . '';
}
$docinfo['fileDestinationName'] .= '.'
. strtolower($func->extractFileExt($tmpSourceCopy));
$copyResultArray = Ds_copyOnDocserver(
$tmpSourceCopy,
$docinfo,
$docserverTypeObject->fingerprint_mode
);
if (isset($copyResultArray['error']) && $copyResultArray['error'] <> '') {
$storeInfos = array('error' => $copyResultArray['error']);
return $storeInfos;
}
}
$destinationDir = $copyResultArray['destinationDir'];
$fileDestinationName = $copyResultArray['fileDestinationName'];
$destinationDir = substr(
$destinationDir,
strlen($docserver->path_template)
) . DIRECTORY_SEPARATOR;
$destinationDir = str_replace(
DIRECTORY_SEPARATOR,
'#',
$destinationDir
);
$this->setSize($docserver, $newSize);
$storeInfos = array(
'path_template' => $docserver->path_template,
'destination_dir' => $destinationDir,
'docserver_id' => $docserver->docserver_id,
'file_destination_name' => $fileDestinationName,
);
return $storeInfos;
}
/**
* Checks the size of the docserver plus a new file to see
* if there is enough disk space
*
* @param $docserver docservers object
* @param $filesize integer File size
* @return integer New docserver size or 0 if not enough disk space available
*/
public function checkSize($docserver, $filesize)
{
$new_docserver_size = $docserver->actual_size_number + $filesize;
if ($docserver->size_limit_number > 0
&& $new_docserver_size >= $docserver->size_limit_number
) {
return 0;
} else {
return $new_docserver_size;
}
}
/**
* Calculates the next file name in the docserver
* @param $pathOnDocserver docservers path
* @return array Contains 3 items :
* subdirectory path and new filename and error
*/
public function getNextFileNameInDocserver($pathOnDocserver)
{
umask(0022);
//Scans the docserver path
$fileTab = scandir($pathOnDocserver);
//Removes . and .. lines
array_shift($fileTab);
array_shift($fileTab);
if (file_exists(
$pathOnDocserver . DIRECTORY_SEPARATOR . 'package_information'
)
) {
unset($fileTab[array_search('package_information', $fileTab)]);
}
$nbFiles = count($fileTab);
//Docserver is empty
if ($nbFiles == 0 ) {
//Creates the directory
if (!mkdir($pathOnDocserver . '0001', 0770)) {
return array(
'destinationDir' => '',
'fileDestinationName' => '',
'error' => 'Pb to create directory on the docserver:'
. $pathOnDocserver,
);
} else {
Ds_setRights($pathOnDocserver . '0001' . DIRECTORY_SEPARATOR);
$destinationDir = $pathOnDocserver . '0001'
. DIRECTORY_SEPARATOR;
$fileDestinationName = '0001';
return array(
'destinationDir' => $destinationDir,
'fileDestinationName' => $fileDestinationName,
'error' => '',
);
}
} else {
//Gets next usable subdirectory in the docserver
$destinationDir = $pathOnDocserver
. str_pad(
count($fileTab),
4,
'0',
STR_PAD_LEFT
)
. DIRECTORY_SEPARATOR;
$fileTabBis = scandir(
$pathOnDocserver
. strval(str_pad(count($fileTab), 4, '0', STR_PAD_LEFT))
);
//Removes . and .. lines
array_shift($fileTabBis);
array_shift($fileTabBis);
$nbFilesBis = count($fileTabBis);
//If number of files => 1000 then creates a new subdirectory
if ($nbFilesBis >= 1000 ) {
$newDir = ($nbFiles) + 1;
if (!mkdir(
$pathOnDocserver
. str_pad($newDir, 4, '0', STR_PAD_LEFT), 0770
)
) {
return array(
'destinationDir' => '',
'fileDestinationName' => '',
'error' => 'Pb to create directory on the docserver:'
. $pathOnDocserver
. str_pad($newDir, 4, '0', STR_PAD_LEFT),
);
} else {
Ds_setRights(
$pathOnDocserver
. str_pad($newDir, 4, '0', STR_PAD_LEFT)
. DIRECTORY_SEPARATOR
);
$destinationDir = $pathOnDocserver
. str_pad($newDir, 4, '0', STR_PAD_LEFT)
. DIRECTORY_SEPARATOR;
$fileDestinationName = '0001';
return array(
'destinationDir' => $destinationDir,
'fileDestinationName' => $fileDestinationName,
'error' => '',
);
}
} else {
//Docserver contains less than 1000 files
$newFileName = $nbFilesBis + 1;
$greater = $newFileName;
for ($n = 0;$n < count($fileTabBis);$n++) {
$currentFileName = array();
$currentFileName = explode('.', $fileTabBis[$n]);
if ((int) $greater <= (int) $currentFileName[0]) {
if ((int) $greater == (int) $currentFileName[0]) {
$greater ++;
} else {
//$greater < current
$greater = (int) $currentFileName[0] + 1;
}
}
}
$fileDestinationName = str_pad($greater, 4, '0', STR_PAD_LEFT);
return array(
'destinationDir' => $destinationDir,
'fileDestinationName' => $fileDestinationName,
'error' => '',
);
}
}
}
/**
* Sets the size of the docserver
* @param $docserver docservers object
* @param $newSize integer New size of the docserver
*/
public function setSize($docserver, $newSize)
{
$db = new dbquery();
$db->connect();
$db->query(
"update " . _DOCSERVERS_TABLE_NAME
. " set actual_size_number=" . $newSize . " where docserver_id='"
. $docserver->docserver_id . "'"
);
$db->disconnect();
return $newSize;
}
/**
* Get the network link of a resource on a docserver
* @param bigint $gedId id of th resource
* @param string $tableName name of the res table
* @param string $adrTable name of the res address table
* @return array of net address to the docserver
*/
public function retrieveDocserverNetLinkOfResource(
$gedId,
$tableName,
$adrTable
) {
$adr = array();
$resource = new resource();
$whereClause = ' and 1=1';
$adr = $resource->getResourceAdr(
$tableName,
$gedId,
$whereClause,
$adrTable
);
if ($adr['status'] == 'ko') {
$result = array(
'status' => 'ko',
'value' => '',
'error' => _RESOURCE_NOT_EXISTS,
);
} else {
//TODO : MANAGEMENT OF GEOLOCALISATION FAILOVER
//$resource->show_array($adr);
$docserver = $adr[0][0]['docserver_id'];
//retrieve infos of the docserver
$docserverObject = $this->get($docserver);
//retrieve infos of the docserver type
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_locations_controler.php');
$docserverLocationControler = new docserver_locations_controler();
$docserverLocationObject =
$docserverLocationControler->get(
$docserverObject->docserver_location_id
);
$result = array(
'status' => 'ok',
'value' => $docserverLocationObject->net_link,
'error' => '',
);
}
return $result;
}
/**
*
* Get a resources at a specific address in adr table or res table
* @param array $adr
*/
public function viewResourceAdr($adr) {
//retrieve infos of the docserver type
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_types_controler.php');
$history = new history();
$coreTools = new core_tools();
$fingerprintFromDb = $adr['fingerprint'];
//$format = $adr[0][$cptDocserver]['format'];
$docserverObject = $this->get($adr['docserver_id']);
$docserver = $docserverObject->path_template;
$file = $docserver . $adr['path']
. $adr['filename'];
$file = str_replace('#', DIRECTORY_SEPARATOR, $file);
$docserverTypeControler = new docserver_types_controler();
$docserverTypeObject = $docserverTypeControler->get(
$docserverObject->docserver_type_id
);
if (!file_exists($file)) {
$concatError .= _FILE_NOT_EXISTS_ON_THE_SERVER . ' : '
. $file . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id'] . ':'
. _FILE_NOT_EXISTS_ON_THE_SERVER . ' : '
. $file, $_SESSION['config']['databasetype']
);
} else {
$fingerprintFromDocserver = Ds_doFingerprint(
$file, $docserverTypeObject->fingerprint_mode
);
$adrToExtract = array();
$adrToExtract = $adr;
$adrToExtract['path_to_file'] = $file;
$docserverTypeControler = new docserver_types_controler();
$docserverTypeObject = $docserverTypeControler->get(
$docserverObject->docserver_type_id
);
if ($docserverTypeObject->is_container == 'Y'
&& $adr['offset_doc'] == ''
) {
$error = true;
$concatError .=
_PB_WITH_OFFSET_OF_THE_DOC_IN_THE_CONTAINER . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id'] . ':'
. _PB_WITH_OFFSET_OF_THE_DOC_IN_THE_CONTAINER,
$_SESSION['config']['databasetype']
);
}
//manage compressed resource
if ($docserverTypeObject->is_compressed == 'Y') {
$extract = array();
$extract = Ds_extractArchive(
$adrToExtract,
$docserverTypeObject->fingerprint_mode
);
if ($extract['status'] == 'ko' || !is_array($extract)) {
$error = true;
$concatError .= $extract['error'] . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id'] . ':'
. $extract['error'],
$_SESSION['config']['databasetype']
);
} else {
$file = $extract['path'];
$mimeType = $extract['mime_type'];
$format = $extract['format'];
//to control fingerprint of the offset
$fingerprintFromDocserver = $extract['fingerprint'];
}
} else {
$mimeType = Ds_getMimeType(
$adrToExtract['path_to_file']
);
$format = substr(
$adrToExtract['filename'],
strrpos($adrToExtract['filename'], '.') + 1
);
}
//manage view of the file
$use_tiny_mce = false;
if (strtolower($format) == 'maarch'
&& $coreTools->is_module_loaded('templates')
) {
$mode = 'content';
$type_state = true;
$use_tiny_mce = true;
$mimeType = 'application/maarch';
} else {
require_once 'core/docservers_tools.php';
$arrayIsAllowed = array();
$arrayIsAllowed = Ds_isFileTypeAllowed($file);
$type_state = $arrayIsAllowed['status'];
}
//if fingerprint from db = 0 we do not control fingerprint
if ($fingerprintFromDb == '0'
|| ($fingerprintFromDb == $fingerprintFromDocserver)
) {
if ($type_state <> false) {
if ($_SESSION['history']['resview'] == 'true') {
require_once(
'core' . DIRECTORY_SEPARATOR
. 'class' . DIRECTORY_SEPARATOR
. 'class_history.php'
);
$history->add(
$tableName, $gedId, 'VIEW', 'resview',
_VIEW_DOC_NUM . $gedId,
$_SESSION['config']['databasetype'],
'indexing_searching'
);
}
//count number of viewed in listinstance for
//the user
if ($coreTools->is_module_loaded('entities')
&& $coreTools->is_module_loaded('basket')
) {
require_once(
'modules' . DIRECTORY_SEPARATOR
. 'entities' . DIRECTORY_SEPARATOR
. 'class' . DIRECTORY_SEPARATOR
. 'class_manage_entities.php'
);
$ent = new entity();
$ent->increaseListinstanceViewed($gedId);
}
$encodedContent = '';
if (file_exists($file) && !$error) {
if ($calledByWS) {
$content = '';
$handle = fopen($file, 'r');
if ($handle) {
while (!feof($handle)) {
$content .= fgets($handle, 4096);
}
fclose($handle);
}
$encodedContent = base64_encode($content);
} else {
$fileNameOnTmp = 'tmp_file_' . rand()
. '.' . strtolower($format);
$filePathOnTmp = $_SESSION['config']
['tmppath'] . DIRECTORY_SEPARATOR
. $fileNameOnTmp;
copy($file, $filePathOnTmp);
}
$result = array(
'status' => 'ok',
'mime_type' => $mimeType,
'ext' => $format,
'file_content' => $encodedContent,
'tmp_path' => $_SESSION['config']
['tmppath'],
'file_path' => $filePathOnTmp,
'called_by_ws' => $calledByWS,
'error' => '',
);
if (isset($extract)
&& file_exists($extract['tmpArchive'])
) {
Ds_washTmp($extract['tmpArchive']);
}
return $result;
} else {
$concatError .= _FILE_NOT_EXISTS . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id']
. ':' . _FILE_NOT_EXISTS,
$_SESSION['config']['databasetype']
);
}
} else {
$concatError .= _FILE_TYPE . ' ' . _UNKNOWN . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id'] . ':'
. _FILE_TYPE . ' ' . _UNKNOWN,
$_SESSION['config']['databasetype']
);
}
} else {
$concatError .= _PB_WITH_FINGERPRINT_OF_DOCUMENT . '||';
$history->add(
$tableName, $gedId, 'ERR', 'docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr['docserver_id'] . ':'
. _PB_WITH_FINGERPRINT_OF_DOCUMENT,
$_SESSION['config']['databasetype']
);
}
if (file_exists($extract['tmpArchive'])) {
Ds_washTmp($extract['tmpArchive']);
}
}
//if errors :
$result = array(
'status' => 'ko',
'mime_type' => '',
'ext' => '',
'file_content' => '',
'tmp_path' => '',
'file_path' => '',
'called_by_ws' => $calledByWS,
'error' => $concatError,
);
return $result;
}
/**
* View the resource, returns the content of the resource
* @param bigint $gedId id of th resource
* @param string $tableName name of the res table
* @param string $adrTable name of the res address table
* @return array of elements to view the resource :
* status, mime_type, extension,
* file_content, tmp_path, file_path, called_by_ws error
*/
public function viewResource(
$gedId,
$tableName,
$adrTable,
$calledByWS=false
) {
$history = new history();
$coreTools = new core_tools();
//$whereClause = '';
//THE TEST HAVE TO BE DONE BEFORE !!!
$whereClause = ' and 1=1';
/*
if (isset($_SESSION['origin']) && ($_SESSION['origin'] <> 'basket'
&& $_SESSION['origin'] <> 'workflow')
) {
if (isset(
$_SESSION['user']['security']
[$_SESSION['collection_id_choice']]
)
) {
$whereClause = ' and( '
. $_SESSION['user']['security']
[$_SESSION['collection_id_choice']]['DOC']['where']
. ' ) ';
} else {
$whereClause = ' and 1=1';
}
} else {
$whereClause = ' and 1=1';
}
*/
$adr = array();
$resource = new resource();
$adr = $resource->getResourceAdr(
$tableName,
$gedId,
$whereClause,
$adrTable
);
//$coreTools->show_array($adr);
if ($adr['status'] == 'ko') {
$result = array(
'status' => 'ko',
'mime_type' => '',
'ext' => '',
'file_content' => '',
'tmp_path' => '',
'file_path' => '',
'called_by_ws' => $calledByWS,
'error' => _NO_RIGHT_ON_RESOURCE_OR_RESOURCE_NOT_EXISTS,
);
$history->add(
$tableName,
$gedId,
'ERR','docserverserr',
_NO_RIGHT_ON_RESOURCE_OR_RESOURCE_NOT_EXISTS,
$_SESSION['config']['databasetype']
);
} else {
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_types_controler.php');
$docserverTypeControler = new docserver_types_controler();
$concatError = '';
//failover management
for (
$cptDocserver = 0;
$cptDocserver < count($adr[0]);
$cptDocserver++
) {
$error = false;
//retrieve infos of the docserver
$fingerprintFromDb = $adr[0][$cptDocserver]['fingerprint'];
$format = $adr[0][$cptDocserver]['format'];
$docserverObject = $this->get(
$adr[0][$cptDocserver]['docserver_id']
);
$docserver = $docserverObject->path_template;
$file = $docserver . $adr[0][$cptDocserver]['path']
. $adr[0][$cptDocserver]['filename'];
$file = str_replace('#', DIRECTORY_SEPARATOR, $file);
$docserverTypeObject = $docserverTypeControler->get(
$docserverObject->docserver_type_id
);
if (!file_exists($file)) {
$concatError .= _FILE_NOT_EXISTS_ON_THE_SERVER . ' : '
. $file . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id'] . ':'
. _FILE_NOT_EXISTS_ON_THE_SERVER . ' : '
. $file, $_SESSION['config']['databasetype']
);
} else {
$fingerprintFromDocserver = Ds_doFingerprint(
$file, $docserverTypeObject->fingerprint_mode
);
$adrToExtract = array();
$adrToExtract = $adr[0][$cptDocserver];
$adrToExtract['path_to_file'] = $file;
//retrieve infos of the docserver type
require_once('core' . DIRECTORY_SEPARATOR . 'class'
. DIRECTORY_SEPARATOR . 'docserver_types_controler.php');
$docserverTypeControler = new docserver_types_controler();
$docserverTypeObject = $docserverTypeControler->get(
$docserverObject->docserver_type_id
);
if ($docserverTypeObject->is_container == "Y"
&& $adr[0][$cptDocserver]['offset_doc'] == ''
) {
$error = true;
$concatError .=
_PB_WITH_OFFSET_OF_THE_DOC_IN_THE_CONTAINER . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id'] . ':'
. _PB_WITH_OFFSET_OF_THE_DOC_IN_THE_CONTAINER,
$_SESSION['config']['databasetype']
);
}
//manage compressed resource
if ($docserverTypeObject->is_compressed == "Y") {
$extract = array();
$extract = Ds_extractArchive(
$adrToExtract,
$docserverTypeObject->fingerprint_mode
);
if ($extract['status'] == 'ko' || !is_array($extract)) {
$error = true;
$concatError .= $extract['error'] . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id'] . ':'
. $extract['error'],
$_SESSION['config']['databasetype']
);
} else {
$file = $extract['path'];
$mimeType = $extract['mime_type'];
$format = $extract['format'];
//to control fingerprint of the offset
$fingerprintFromDocserver = $extract['fingerprint'];
}
} else {
$mimeType = Ds_getMimeType(
$adrToExtract['path_to_file']
);
}
/*echo $file . '
';
echo $docserverTypeObject->fingerprint_mode . '
';
echo 'from ds:' . $fingerprintFromDocserver . '
';
echo 'from db:' . $fingerprintFromDb . '
';exit;*/
//manage view of the file
$use_tiny_mce = false;
if (strtolower($format) == 'maarch'
&& $coreTools->is_module_loaded('templates')
) {
$mode = 'content';
$type_state = true;
$use_tiny_mce = true;
$mimeType = 'application/maarch';
} else {
require_once 'core/docservers_tools.php';
$arrayIsAllowed = array();
$arrayIsAllowed = Ds_isFileTypeAllowed($file);
$type_state = $arrayIsAllowed['status'];
}
//if fingerprint from db = 0 we do not control fingerprint
if ($fingerprintFromDb == '0'
|| ($fingerprintFromDb == $fingerprintFromDocserver)
|| $docserverTypeObject->fingerprint_mode == 'NONE'
) {
if ($type_state <> false) {
if ($_SESSION['history']['resview'] == 'true') {
require_once(
'core' . DIRECTORY_SEPARATOR
. 'class' . DIRECTORY_SEPARATOR
. 'class_history.php'
);
$history->add(
$tableName, $gedId, 'VIEW','resview',
_VIEW_DOC_NUM . $gedId,
$_SESSION['config']['databasetype'],
'indexing_searching'
);
}
//count number of viewed in listinstance for
//the user
if ($coreTools->is_module_loaded('entities')
&& $coreTools->is_module_loaded('basket')
) {
require_once(
'modules' . DIRECTORY_SEPARATOR
. 'entities' . DIRECTORY_SEPARATOR
. 'class' . DIRECTORY_SEPARATOR
. 'class_manage_entities.php'
);
$ent = new entity();
$ent->increaseListinstanceViewed($gedId);
}
$encodedContent = '';
if (file_exists($file) && !$error) {
if ($calledByWS) {
$content = '';
/*$content = file_get_contents(
$file, FILE_BINARY
);*/
$handle = fopen($file, 'r');
if ($handle) {
while (!feof($handle)) {
$content .= fgets($handle, 4096);
}
fclose($handle);
}
$encodedContent = base64_encode($content);
} else {
$fileNameOnTmp = 'tmp_file_' . rand()
. '.' . strtolower($format);
$filePathOnTmp = $_SESSION['config']
['tmppath'] . DIRECTORY_SEPARATOR
. $fileNameOnTmp;
copy($file, $filePathOnTmp);
}
$result = array(
'status' => 'ok',
'mime_type' => $mimeType,
'ext' => $format,
'file_content' => $encodedContent,
'tmp_path' => $_SESSION['config']
['tmppath'],
'file_path' => $filePathOnTmp,
'called_by_ws' => $calledByWS,
'error' => '',
);
if (isset($extract)
&& file_exists($extract['tmpArchive'])
) {
Ds_washTmp($extract['tmpArchive']);
}
return $result;
} else {
$concatError .= _FILE_NOT_EXISTS . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id']
. ':' . _FILE_NOT_EXISTS,
$_SESSION['config']['databasetype']
);
}
} else {
$concatError .= _FILE_TYPE . ' ' . _UNKNOWN . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id'] . ':'
. _FILE_TYPE . ' ' . _UNKNOWN,
$_SESSION['config']['databasetype']
);
}
} else {
$concatError .= _PB_WITH_FINGERPRINT_OF_DOCUMENT . '||';
$history->add(
$tableName, $gedId, 'ERR','docserverserr',
_FAILOVER . ' ' . _DOCSERVERS . ' '
. $adr[0][$cptDocserver]['docserver_id'] . ':'
. _PB_WITH_FINGERPRINT_OF_DOCUMENT,
$_SESSION['config']['databasetype']
);
}
if (file_exists($extract['tmpArchive'])) {
Ds_washTmp($extract['tmpArchive']);
}
}
}
}
//if errors :
$result = array(
'status' => 'ko',
'mime_type' => '',
'ext' => '',
'file_content' => '',
'tmp_path' => '',
'file_path' => '',
'called_by_ws' => $calledByWS,
'error' => $concatError,
);
return $result;
}
}