* @author Laurent Giovannoni */ class webdav_tools { //Parameters private $extensions_xml_path = "xml/extensions.xml"; private $programs_xml_path = "xml/programs.xml"; private $parameter_id = "reponse_reservee"; //Variables public $context; private $db; public function __construct($context=".") { if (!isset($_SESSION) OR count($_SESSION) == 0) return null; $this->context = $context; //////////////////////////////////// $this->db= new dbquery(); $this->db->connect(); } public function is_reserved_by($res_table,$res_id) { $time_limit = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT param_value_char FROM ".$_SESSION['tablename']['param']." WHERE KEY1 = '".$res_table."' AND KEY2 = '".$res_id."' AND id = '".$this->parameter_id."' AND VALUE > ".$time_limit ); if ($res = $this->db->fetch_object()) { return $res->param_value_char; } else { return false; } } public function get_application($user_id,$format) { $xml_programs = DOMDocument::load($this->programs_xml_path); $xp_xml_programs = new domxpath($xml_programs); //Is an application definied for the format ? $this->db->query("SELECT NAME, PATH FROM ".$_SESSION['tablename']['ext_applications']." WHERE USER_ID = '".$user_id."' AND FORMAT = '".$format."'"); if ($res2 = $this->db->fetch_object()) { $return = array("APP_NAME" => $res2->NAME, "APP_PATH" => $res2->PATH); } else { $req_prog = $xp_xml_programs->query("//APPLICATION[FORMAT='".$format."']"); if ($req_prog->length > 0) { $return = array("APP_NAME" => $req_prog->item(0)->getAttribute("NAME"), "APP_PATH" => $req_prog->item(0)->getAttribute("PATH")); } else { return("_NO_APPLICATION_FORMAT"); } } //print_r($return);exit; return $return; } public function closeWebdav($webdav_id) { $this->deleteDirectory($this->context."/".$_SESSION['config']['webdav_content']."/".$webdav_id); $this->db->query(" DELETE FROM ".$_SESSION['tablename']['param']." WHERE KEY3 = '".$webdav_id."' AND id = '".$this->parameter_id."' "); } public function mountWebdav($user_id,$res_table,$res_id,$gen_id=null) { $this->db->query("SELECT r.RES_ID, r.TITLE, r.FORMAT, r.CREATION_DATE, r.DOCSERVER_ID, r.PATH, r.FILENAME, r.FINGERPRINT, r.FILESIZE, d.PATH_TEMPLATE, d.ACTUAL_SIZE FROM ".$res_table." r, ".$_SESSION['tablename']['docservers']." d WHERE r.SOURCE = 'Local File' AND r.DOCSERVER_ID = d.DOCSERVER_ID AND r.STATUS = 'REP' AND r.RES_ID = ".$res_id); if ($res = $this->db->fetch_object()) { $xml_extensions = DOMDocument::load($this->extensions_xml_path); $xp_xml_extensions = new domxpath($xml_extensions); //Is the format allowed ? $req_ext = $xp_xml_extensions->query("//FORMAT[name='".$res->FORMAT."']"); if ($req_ext->length == 0) { //Not an allowed format (extension) return("_FORMAT_NOT_ALLOWED"); } $get_application = $this->get_application($user_id,$res->FORMAT); if (!is_array($get_application)) { return $get_application; } $return = $get_application; $return["FILENAME"] = $res->FILENAME; //Create the Webdav directory $now = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT KEY3 AS WEBDAV_ID FROM ".$_SESSION['tablename']['param']." WHERE KEY1 = '".$res_table."' AND KEY2 = '".$res_id."' AND id = '".$this->parameter_id."' AND param_value_char = '".$user_id."' AND VALUE > ".mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y"))); $re_use_webdav = false; if ($res2 = $this->db->fetch_object()) { $gen_id = $res2->WEBDAV_ID; $re_use_webdav = true; } else { $gen_id = md5($user_id.$res->RES_ID.microtime()); } if (!$re_use_webdav && !mkdir($this->context."/".$_SESSION['config']['webdav_content']."/".$gen_id)) { //Unable to create the webdav directory return("_UNABLE_TO_CREATE_DIR"); } //Copy document from the docserver to the webdav directory if (!$re_use_webdav && !copy ($res->PATH_TEMPLATE."/".str_replace("#","/",$res->PATH)."/".$res->FILENAME, ($this->context."/".$_SESSION['config']['webdav_content']."/".$gen_id."/".$res->FILENAME))) { //Unable to copy the document from the docserver to the webdav directory rmdir($this->context."/".$_SESSION['config']['webdav_content']."/".$gen_id); return("_UNABLE_TO_COPY_FILE"); } $return["ID"] = $gen_id; } else { return ("_DOC_DOESNT_EXISTS"); } return $return; } public function mountWebdavCreateModel($modelBaseId = 0, $user) { if (isset($_SESSION['admin_models']) && isset($_SESSION['admin_models']['status']) && $_SESSION['admin_models']['status'] == 'open') { $modelPath = 'include/odtphp/models/model_' . $modelBaseId . '.odt'; if (!file_exists($modelPath)) { $modelPath = 'include/odtphp/models/base_models/model_base_1.odt'; } } else { //si nouveau alors on prend celui dans les modèles de base $_SESSION['admin_models']['status'] = 'open'; $modelPath = 'include/odtphp/models/base_models/model_' . $modelBaseId . '.odt'; } if (file_exists($modelPath)) { $modelNameTarget = 'model.odt'; $xml_extensions = DOMDocument::load($this->extensions_xml_path); $xp_xml_extensions = new domxpath($xml_extensions); //Is the format allowed ? $req_ext = $xp_xml_extensions->query("//FORMAT[name='ODT']"); if ($req_ext->length == 0) { //Not an allowed format (extension) return('_FORMAT_NOT_ALLOWED'); } $get_application = $this->get_application($user_id, 'ODT'); if (!is_array($get_application)) { return $get_application; } $return = $get_application; $return['FILENAME'] = $modelNameTarget; //Create the Webdav directory $this->db->query(" SELECT KEY3 AS WEBDAV_ID FROM ".$_SESSION['tablename']['param']." WHERE KEY1 = 'models' AND KEY2 = '".$modelBaseId."' AND id = '".$this->parameter_id."' AND param_value_char = '".$user_id."' AND VALUE > ".mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y"))); $re_use_webdav = false; if ($res2 = $this->db->fetch_object()) { $gen_id = $res2->WEBDAV_ID; $re_use_webdav = true; } else { $gen_id = md5($user . '_' . rand()); } if (!$re_use_webdav && !mkdir($this->context . '/' . $_SESSION['config']['webdav_content'] . '/' . $gen_id)) { //Unable to create the webdav directory return('_UNABLE_TO_CREATE_DIR'); } //Copy document from the model dir to the webdav directory if (!$re_use_webdav && !copy($modelPath, $this->context . '/' . $_SESSION['config']['webdav_content'] . '/' . $gen_id . '/' . $modelNameTarget)) { //Unable to copy the document from the model dir to the webdav directory rmdir($this->context . '/' . $_SESSION['config']['webdav_content'] . '/' . $gen_id); return('_UNABLE_TO_COPY_FILE'); } $return['ID'] = $gen_id; } else { return ('_MODEL_DOESNT_EXISTS'); } return $return; } public function save($webdav_id) { $this->db->query(" SELECT KEY1 FROM ".$_SESSION['tablename']['param']." WHERE id = '".$this->parameter_id."' AND KEY3 = '".$webdav_id."'"); $resTest = $this->db->fetch_object(); if ($resTest->KEY1 == 'models') { //c'est un modèle depuis administration $now = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT KEY1 AS MODEL_TABLE, KEY2 AS MODEL_ID, KEY3 AS WEBDAV_ID FROM ".$_SESSION['tablename']['param']." WHERE id = '".$this->parameter_id."' AND KEY3 = '".$webdav_id."' AND VALUE > ".$now); if ($res = $this->db->fetch_object()) { $webdav_id = $res->WEBDAV_ID; $model_id = $res->MODEL_ID; $this_file_path = $this->context."/".$_SESSION['config']['webdav_content']."/".$webdav_id."/model.odt"; //Copy document from the webdav directory to model directory if (!copy($this_file_path, '../../include/odtphp/models/model_' . $model_id . '.odt')) { return("_UNABLE_TO_COPY_FILE"); } return true; } else { return "_MODEL_NOT_YET_RESERVED"; } } else { $reserved_by = $this->is_reserved_by($res_table,$res_id); $now = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT KEY1 AS RES_TABLE, KEY2 AS RES_ID, KEY3 AS WEBDAV_ID FROM ".$_SESSION['tablename']['param']." WHERE id = '".$this->parameter_id."' AND KEY3 = '".$webdav_id."' AND VALUE > ".$now); if ($res = $this->db->fetch_object()) { $webdav_id = $res->WEBDAV_ID; $res_id = $res->RES_ID; $res_table = $res->RES_TABLE; $this->db->query(" SELECT r.RES_ID, r.TITLE, r.FORMAT, r.CREATION_DATE, r.DOCSERVER_ID, r.PATH, r.FILENAME, r.FINGERPRINT, r.FILESIZE, d.PATH_TEMPLATE, d.ACTUAL_SIZE FROM ".$res_table." r, ".$_SESSION['tablename']['docservers']." d WHERE r.SOURCE = 'Local File' AND r.DOCSERVER_ID = d.DOCSERVER_ID AND r.STATUS = 'REP' AND r.RES_ID = ".$res_id); if ($res2 = $this->db->fetch_object()) { $this_file_path = $this->context."/".$_SESSION['config']['webdav_content']."/".$webdav_id."/".$res2->FILENAME; //Copy document from the webdav directory to docserver if (!copy ($this_file_path, $res2->PATH_TEMPLATE."/".str_replace("#","/",$res2->PATH)."/".$res2->FILENAME)) { return("_UNABLE_TO_COPY_FILE"); } //Update docserver actual size $this->db->query(" UPDATE ".$_SESSION['tablename']['docservers']." SET ACTUAL_SIZE = ".($res2->ACTUAL_SIZE - $res2->FILESIZE + filesize($this_file_path))." WHERE DOCSERVER_ID = '".$res2->DOCSERVER_ID."'"); //Update res_table $this->db->query(" UPDATE ".$res_table." SET FILESIZE = ".filesize($this_file_path).", FINGERPRINT = '".md5_file($this_file_path)."' WHERE RES_ID = ".$res2->RES_ID); return true; } else { return "_RESPONSE_DOESNT_EXIST"; } } else { return "_RESPONSE_NOT_YET_RESERVED"; } } } public function updateExpiryDate($webdav_id,$user_id) { $now = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $time_limit = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")) + ($_SESSION['config']['webdav_reserved_time'] * 60); $this->db->query(" UPDATE ".$_SESSION['tablename']['param']." SET VALUE = ".$time_limit." WHERE KEY3 = '".$webdav_id."' AND id = '".$this->parameter_id."' AND param_value_char = '".$user_id."' AND VALUE < ".$now); if ($this->db->mysql_affected_rows () == 0) { return false; } return true; } public function addExpiryDate($res_table,$res_id,$webdav_id,$user_id) { $time_limit = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")) + ($_SESSION['config']['webdav_reserved_time'] * 60); //If exists Delete $this->db->query(" DELETE FROM ".$_SESSION['tablename']['param']." WHERE KEY1 = '".$res_table."' AND KEY2 = '".$res_id."' AND KEY3 = '".$webdav_id."' AND id = '".$this->parameter_id."' AND param_value_char = '".$user_id."' "); $this->db->query(" INSERT INTO ".$_SESSION['tablename']['param']." (KEY1,KEY2,KEY3,VALUE,id,param_value_char) VALUES ('".$res_table."','".$res_id."','".$webdav_id."','".$time_limit."','".$this->parameter_id."','".$user_id."')"); } public function deleteExpiredWebdav() { $time_limit = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT KEY3 FROM ".$_SESSION['tablename']['param']." WHERE VALUE < ".$time_limit." AND id = '".$this->parameter_id."'"); while ($res = $this->db->fetch_object()) { $this->deleteDirectory($this->context."/".$_SESSION['config']['webdav_content']."/".$res->KEY3); } $this->db->query(" DELETE FROM ".$_SESSION['tablename']['param']." WHERE VALUE < ".$time_limit." AND id = '".$this->parameter_id."'"); } /*Delete no empty directory*/ /* Thx to asn at asn24 dot dk (php.net)*/ private function deleteDirectory($dir) { if (!file_exists($dir)) return true; if (!is_dir($dir) || is_link($dir)) return unlink($dir); foreach (scandir($dir) as $item) { if ($item == '.' || $item == '..') continue; if (!$this->deleteDirectory($dir . "/" . $item)) { chmod($dir . "/" . $item, 0777); if (!$this->deleteDirectory($dir . "/" . $item)) return false; }; } return rmdir($dir); } public function time_before_expiration($webdav_id) { $now = mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y")); $this->db->query(" SELECT VALUE FROM ".$_SESSION['tablename']['param']." WHERE id = '".$this->parameter_id."' AND KEY3 = '".$webdav_id."'" ); if ($res = $this->db->fetch_object()) { $sec_before_expiration = $res->VALUE - $now; if ($sec_before_expiration < 0) return 0; else return $sec_before_expiration; } else { return 0; } } } ?>