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"); } } 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 save($webdav_id) { $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; } } } ?>