/** * This function will process uploaded file * * @param array $uploaded_file * @param boolean $create_revision Create new revision or update last one * @param string $revision_comment Revision comment, if any * @return ProjectFileRevision */ function handleUploadedFile($uploaded_file, $create_revision = true, $revision_comment = '') { $revision = null; if (!$create_revision) { $revision = $this->getLastRevision(); } // if if (!$revision instanceof ProjectFileRevision) { $revision = new ProjectFileRevision(); $revision->setFileId($this->getId()); $revision->setRevisionNumber($this->getNextRevisionNumber()); if (trim($revision_comment) == '' && $this->countRevisions() < 1) { $revision_comment = lang('initial versions'); } // if } // if $revision->deleteThumb(false); // remove thumb // We have a file to handle! //executes only while uploading files if (!is_array($uploaded_file) || !isset($uploaded_file['name']) || !isset($uploaded_file['size']) || !isset($uploaded_file['type']) || (!isset($uploaded_file['tmp_name']) || !is_readable($uploaded_file['tmp_name']))) { throw new InvalidUploadError($uploaded_file); } // if if (isset($uploaded_file['error']) && $uploaded_file['error'] > UPLOAD_ERR_OK) { throw new InvalidUploadError($uploaded_file); } // if //eyedoc MOD $extension = get_file_extension(basename($uploaded_file['name'])); if ($uploaded_file['type'] == 'application/octet-stream' && $extension == 'eyedoc') { $uploaded_file['type'] = 'text/html'; } //eyedoc MOD // calculate hash if ($revision->columnExists('hash')) { $hash = hash_file("sha256", $uploaded_file['tmp_name']); $revision->setColumnValue('hash', $hash); } $repository_id = FileRepository::addFile($uploaded_file['tmp_name'], array('name' => $uploaded_file['name'], 'type' => $uploaded_file['type'], 'size' => $uploaded_file['size'])); $revision->setRepositoryId($repository_id); $revision->deleteThumb(false); $revision->setFilesize($uploaded_file['size']); if (config_option('detect_mime_type_from_extension')) { $type = Mime_Types::instance()->get_type($extension); if ($type) { $revision->setTypeString($type); } else { $revision->setTypeString($uploaded_file['type']); } } else { $revision->setTypeString($uploaded_file['type']); } if (trim($extension)) { $file_type = FileTypes::getByExtension($extension); if ($file_type instanceof Filetype) { $revision->setFileTypeId($file_type->getId()); } // if } // if $revision->setComment($revision_comment); $revision->save(); $this->last_revision = $revision; // update last revision return $revision; }
function uploadDocument($doc_name, $ws_id, $path) { if (str_starts_with($doc_name, "~")) { return; } try { DB::beginWork(); $project = Projects::findById($ws_id); //$file = ProjectFiles::findOne(array("conditions" => "`filename` = '$doc_name'")); $files = ProjectFiles::getAllByFilename($doc_name, $ws_id); if (is_array($files) && count($files) > 0) { $file = $files[0]; } else { $file = null; } if (!$file instanceof ProjectFile) { $file = new ProjectFile(); $file->setFilename($doc_name); $file->setIsVisible(true); $file->setIsPrivate(false); $file->setIsImportant(false); $file->setCommentsEnabled(true); $file->setAnonymousCommentsEnabled(false); //$file->setCreatedOn(new DateTimeValue(time()) ); } $sourcePath = $path . $doc_name; $handle = fopen($sourcePath, "r"); $size = filesize($sourcePath); $file_content = fread($handle, $size); fclose($handle); $file_dt['name'] = $file->getFilename(); $file_dt['size'] = strlen($file_content); $file_dt['tmp_name'] = $sourcePath; //TEMP_PATH . DIRECTORY_SEPARATOR . rand() ; $extension = trim(get_file_extension($sourcePath)); $file_dt['type'] = Mime_Types::instance()->get_type($extension); if (!trim($file_dt['type'])) { $file_dt['type'] = 'text/html'; } $file->save(); $file->removeFromAllWorkspaces(); $file->addToWorkspace($project); $old_revs = $file->getRevisions(); foreach ($old_revs as $rev) { $rev->delete(); } $revision = $file->handleUploadedFile($file_dt, true, ''); $file_date = new DateTimeValue(filemtime($sourcePath)); $revision->setCreatedOn($file_date); $revision->setUpdatedOn($file_date); $revision->save(); $file->setCreatedOn($file_date); $file->setUpdatedOn($file_date); $file->save(); $ws = $file->getWorkspaces(); ApplicationLogs::createLog($file, $ws, ApplicationLogs::ACTION_ADD); ImportLogger::instance()->log(" File: {$doc_name} [{$ws_id}]"); print " File: {$doc_name} [{$ws_id}]\r\n"; DB::commit(); } catch (Exception $e) { DB::rollback(); ImportLogger::instance()->logError("{$e}\r\n**************************************************"); print "\r\n\r\nERROR: {$e}\r\n"; } }
private function upload_file($file, $filename, $path, $members) { try { if ($file == null) { $file = new ProjectFile(); $file->setFilename($filename); $file->setIsVisible(true); $file->setCreatedOn(new DateTimeValue(time())); } $file_dt['name'] = $file->getFilename(); $file_dt['size'] = filesize($path); $file_dt['tmp_name'] = $path; $extension = trim(get_file_extension($filename)); $file_dt['type'] = Mime_Types::instance()->get_type($extension); if(!trim($file_dt['type'])) $file_dt['type'] = 'text/html'; DB::beginWork(); $file->save(); $ctrl = new ObjectController() ; if (is_array($members)) { $ctrl->add_to_members($file, array_flat($members)); } $revision = $file->handleUploadedFile($file_dt, true, ''); ApplicationLogs::createLog($file, ApplicationLogs::ACTION_ADD); DB::commit(); return true; } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } return false; } // upload_extracted_file
private function upload_file($file, $filename, $path, $workspaces) { try { if ($file == null) { $file = new ProjectFile(); $file->setFilename($filename); $file->setIsVisible(true); $file->setIsPrivate(false); $file->setIsImportant(false); $file->setCommentsEnabled(true); $file->setAnonymousCommentsEnabled(false); $file->setCreatedOn(new DateTimeValue(time())); } $file_dt['name'] = $file->getFilename(); $file_dt['size'] = filesize($path); $file_dt['tmp_name'] = $path; $extension = trim(get_file_extension($filename)); $file_dt['type'] = Mime_Types::instance()->get_type($extension); if (!trim($file_dt['type'])) { $file_dt['type'] = 'text/html'; } DB::beginWork(); $file->save(); if (is_array($workspaces)) { foreach ($workspaces as $ws) { $file->addToWorkspace($ws); } } $revision = $file->handleUploadedFile($file_dt, true, ''); ApplicationLogs::createLog($file, $workspaces, ApplicationLogs::ACTION_ADD); DB::commit(); return true; } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } return false; }
function classifyFile($classification_data, $email, $parsedEmail, $validWS, $mantainWs = true, $csv = '') { if (!is_array($classification_data)) { $classification_data = array(); } if (!isset($parsedEmail["Attachments"])) { throw new Exception(lang('no attachments found for email')); } for ($c = 0; $c < count($classification_data); $c++) { if (isset($classification_data["att_" . $c]) && $classification_data["att_" . $c]) { $att = $parsedEmail["Attachments"][$c]; $fName = str_starts_with($att["FileName"], "=?") ? iconv_mime_decode($att["FileName"], 0, "UTF-8") : utf8_safe($att["FileName"]); if (trim($fName) == "" && strlen($att["FileName"]) > 0) { $fName = utf8_encode($att["FileName"]); } try { $file = ProjectFiles::findOne(array('conditions' => "`filename` = " . DB::escape($fName) . " AND `mail_id` = " . $email->getId())); DB::beginWork(); if ($file == null) { $fileIsNew = true; $file = new ProjectFile(); $file->setFilename($fName); $file->setIsVisible(true); $file->setIsPrivate(false); $file->setIsImportant(false); $file->setCommentsEnabled(true); $file->setAnonymousCommentsEnabled(false); $file->setMailId($email->getId()); $file->save(); } else { $fileIsNew = false; } if (!$mantainWs && !$fileIsNew) { $file->removeFromWorkspaces(logged_user()->getWorkspacesQuery()); } foreach ($validWS as $w) { if (!$file->hasWorkspace($w)) { $file->addToWorkspace($w); } } $file->setTagsFromCSV($csv); $enc = array_var($parsedMail, 'Encoding', 'UTF-8'); $ext = utf8_substr($fName, strrpos($fName, '.') + 1, utf8_strlen($fName, $enc), $enc); $mime_type = ''; if (Mime_Types::instance()->has_type($att["content-type"])) { $mime_type = $att["content-type"]; //mime type is listed & valid } else { $mime_type = Mime_Types::instance()->get_type($ext); //Attempt to infer mime type } if ($fileIsNew) { $tempFileName = ROOT . "/tmp/" . logged_user()->getId() . "x" . gen_id(); $fh = fopen($tempFileName, 'w') or die("Can't open file"); fwrite($fh, $att["Data"]); fclose($fh); $fileToSave = array("name" => $fName, "type" => $mime_type, "tmp_name" => $tempFileName, "error" => 0, "size" => filesize($tempFileName)); $revision = $file->handleUploadedFile($fileToSave, true, lang('attachment from email', $email->getSubject())); // handle uploaded file $email->linkObject($file); ApplicationLogs::createLog($file, $email->getWorkspaces(), ApplicationLogs::ACTION_ADD); } DB::commit(); // Error... } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } if (isset($tempFileName) && is_file($tempFileName)) { unlink($tempFileName); } } } }
function uploadFile($username, $password, $workspaces, $tags, $generate_rev, $filename, $description, $do_checkin, $data) { $result = array('status' => true, 'errorid' => 0, 'message' => ''); if ($this->loginUser($username, $password)) { try { DB::beginWork(); $file = null; $files = ProjectFiles::getAllByFilename($filename, logged_user()->getWorkspacesQuery()); if (is_array($files) && count($files) > 0) { if ($generate_rev) { $file = ProjectFiles::findById($files[0]->getId()); if ($file->isCheckedOut()) { if (!$file->canCheckin(logged_user())) { $result['status'] = false; $result['errorid'] = 1004; $result['message'] = lang('no access permissions'); } $file->setCheckedOutById(0); } else { // Check for edit permissions if (!$file->canEdit(logged_user())) { $result['status'] = false; $result['errorid'] = 1004; $result['message'] = lang('no access permissions'); } } } } if ($result['status']) { $enteredWS = Projects::findByCSVIds($workspaces); $validWS = array(); foreach ($enteredWS as $ws) { if (ProjectFile::canAdd(logged_user(), $ws)) { $validWS[] = $ws; } } if (count($validWS) == 0) { $result['status'] = false; $result['errorid'] = 1005; $result['message'] = 'Invalid workspaces given. Check access permissions.'; } else { $make_revision_comment = $file != null; if ($file == null) { $file = new ProjectFile(); $file->setFilename($filename); $file->setIsVisible(true); $file->setIsPrivate(false); $file->setIsImportant(false); $file->setCommentsEnabled(true); $file->setAnonymousCommentsEnabled(false); $file->setCreatedOn(new DateTimeValue(time())); $file->setDescription($description); } $file_dt['name'] = $file->getFilename(); $file_dt['size'] = strlen($data); $file_dt['tmp_name'] = ROOT . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . rand(); $extension = trim(get_file_extension($file->getFilename())); $file_dt['type'] = Mime_Types::instance()->get_type($extension); if (!trim($file_dt['type'])) { $file_dt['type'] = 'text/html'; } $handle = fopen($file_dt['tmp_name'], "w"); fwrite($handle, $data, $file_dt['size']); fclose($handle); $file->save(); $revision = $file->handleUploadedFile($file_dt, true, $make_revision_comment ? $description : ''); $file->setTagsFromCSV($tags); foreach ($validWS as $w) { $file->addToWorkspace($w); } foreach ($validWS as $w) { ApplicationLogs::createLog($file, $w, ApplicationLogs::ACTION_ADD); } DB::commit(); $result['message'] = 'd' . str_pad($file->getId(), 3, '0', STR_PAD_LEFT) . 'r' . $file->getRevisionNumber(); if (!$do_checkin) { $this->checkoutFile($username, $password, $file->getId()); } } } } catch (Exception $e) { DB::rollback(); $result['message'] = $e->getMessage(); $result['errorid'] = 1003; $result['status'] = false; // If we uploaded the file remove it from repository if (isset($revision) && $revision instanceof ProjectFileRevision && FileRepository::isInRepository($revision->getRepositoryId())) { FileRepository::deleteFile($revision->getRepositoryId()); } } } else { $result['status'] = false; $result['errorid'] = 1002; $result['message'] = lang('invalid login data'); } return $this->result_to_xml($result, 'result'); }
function classifyFile($classification_data, $email, $parsedEmail, $members, $remove_prev, $use_transaction) { if (!is_array($classification_data)) { $classification_data = array(); } if (!isset($parsedEmail["Attachments"])) { return; //throw new Exception(lang('no attachments found for email')); } $account_owner = logged_user() instanceof contact ? logged_user() : Contacts::findById($email->getAccount()->getContactId()); for ($c = 0; $c < count($classification_data); $c++) { if (isset($classification_data["att_" . $c]) && $classification_data["att_" . $c] && isset($parsedEmail["Attachments"][$c])) { // dont classify inline images if (array_var($parsedEmail["Attachments"][$c], 'FileDisposition') == 'attachment') { $att = $parsedEmail["Attachments"][$c]; $fName = str_starts_with($att["FileName"], "=?") ? iconv_mime_decode($att["FileName"], 0, "UTF-8") : utf8_safe($att["FileName"]); if (trim($fName) == "" && strlen($att["FileName"]) > 0) { $fName = utf8_encode($att["FileName"]); } $extension = get_file_extension(basename($fName)); $type_file_allow = FileTypes::getByExtension($extension); if (!$type_file_allow instanceof FileType || $type_file_allow->getIsAllow() == 1) { try { $remove_previous_members = $remove_prev; // check for file name and size, if there are some then compare the contents, if content is equal do not classify the attachment. $file_exists = 0; $possible_equal_file_rows = DB::executeAll("SELECT * FROM " . TABLE_PREFIX . "project_file_revisions r \r\n\t\t\t\t\t\t\t\tINNER JOIN " . TABLE_PREFIX . "objects o ON o.id=r.file_id \r\n\t\t\t\t\t\t\t\tINNER JOIN " . TABLE_PREFIX . "project_files f ON f.object_id=r.file_id\r\n\t\t\t\t\t\t\t\tWHERE o.name=" . DB::escape($fName) . " AND r.filesize='" . strlen($att["Data"]) . "' \r\n\t\t\t\t\t\t\t\tAND r.revision_number=(SELECT max(r2.revision_number) FROM " . TABLE_PREFIX . "project_file_revisions r2 WHERE r2.file_id=r.file_id)"); if (is_array($possible_equal_file_rows)) { foreach ($possible_equal_file_rows as $row) { $content = FileRepository::getFileContent($row['repository_id']); if ($content == $att['Data']) { // file already exists $file_exists = $row['file_id']; //Logger::log($email->getId()." - ".$row['mail_id']." - $fName"); if ($remove_previous_members && $row['mail_id'] != $email->getId()) { $remove_previous_members = false; } break; } } } if ($file_exists > 0) { $file = ProjectFiles::findById($file_exists); } else { $file = ProjectFiles::findOne(array('conditions' => "mail_id = " . $email->getId() . " AND o.name = " . DB::escape($fName) . "")); } if ($use_transaction) { DB::beginWork(); } if ($file == null) { $fileIsNew = true; $file = new ProjectFile(); $file->setFilename($fName); $file->setIsVisible(true); $file->setMailId($email->getId()); $file->setCreatedById($account_owner->getId()); $file->save(); } else { $fileIsNew = false; } if ($remove_previous_members) { $dim_ids = array(0); foreach ($members as $m) { $dim_ids[$m->getDimensionId()] = $m->getDimensionId(); } ObjectMembers::delete('`object_id` = ' . $file->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `' . TABLE_PREFIX . 'members` `m` WHERE `m`.`dimension_id` IN (' . implode(',', $dim_ids) . '))'); } $file->addToMembers($members); // fill sharing table in background add_object_to_sharing_table($file, $account_owner); //$file->addToSharingTable(); $enc = array_var($parsedMail, 'Encoding', 'UTF-8'); $ext = utf8_substr($fName, strrpos($fName, '.') + 1, utf8_strlen($fName, $enc), $enc); $mime_type = ''; if (Mime_Types::instance()->has_type($att["content-type"])) { $mime_type = $att["content-type"]; //mime type is listed & valid } else { $mime_type = Mime_Types::instance()->get_type($ext); //Attempt to infer mime type } $userid = logged_user() ? logged_user()->getId() : "0"; $tempFileName = ROOT . "/tmp/" . $userid . "x" . gen_id(); $fh = fopen($tempFileName, 'w') or die("Can't open file"); fwrite($fh, $att["Data"]); fclose($fh); $fileToSave = array("name" => $fName, "type" => $mime_type, "tmp_name" => $tempFileName, "error" => 0, "size" => filesize($tempFileName)); if ($fileIsNew || !$file->getLastRevision() instanceof ProjectFileRevision) { $revision = $file->handleUploadedFile($fileToSave, true, lang('attachment from email', $email->getSubject())); // handle uploaded file $revision->setCreatedById($account_owner->getId()); $revision->save(); ApplicationLogs::createLog($file, ApplicationLogs::ACTION_ADD); /* }else{ $revision = $file->getLastRevision(); $new_hash = hash_file("sha256", $tempFileName); if ($revision->getHash() != $new_hash) { $revision = $file->handleUploadedFile($fileToSave, true, lang('attachment from email', $email->getSubject())); // handle uploaded file ApplicationLogs::createLog($file, ApplicationLogs::ACTION_ADD); }*/ } if ($use_transaction) { DB::commit(); } // Error... } catch (Exception $e) { if ($use_transaction) { DB::rollback(); } flash_error($e->getMessage()); ajx_current("empty"); } } else { flash_error(lang('file extension no allow classify', $fName)); } if (isset($tempFileName) && is_file($tempFileName)) { unlink($tempFileName); } } } } }
function classifyFile($classification_data, $email, $parsedEmail, $members, $remove_prev) { if (!is_array($classification_data)) $classification_data = array(); if (!isset($parsedEmail["Attachments"])) { return; //throw new Exception(lang('no attachments found for email')); } $account_owner = logged_user() instanceof contact ? logged_user() : Contacts::findById($email->getAccount()->getContactId()); for ($c = 0; $c < count($classification_data); $c++) { if (isset($classification_data["att_".$c]) && $classification_data["att_".$c]) { $att = $parsedEmail["Attachments"][$c]; $fName = str_starts_with($att["FileName"], "=?") ? iconv_mime_decode($att["FileName"], 0, "UTF-8") : utf8_safe($att["FileName"]); if (trim($fName) == "" && strlen($att["FileName"]) > 0) $fName = utf8_encode($att["FileName"]); $extension = get_file_extension(basename($fName)); $type_file_allow = FileTypes::getByExtension($extension); if(!($type_file_allow instanceof FileType) || $type_file_allow->getIsAllow() == 1){ try { //$sql = "SELECT o.id FROM ".TABLE_PREFIX."objects o,".TABLE_PREFIX."project_files f WHERE o.id = f.object_id AND f.mail_id = ".$email->getId()." AND o.name = ".DB::escape($fName).""; $sql = "SELECT o.id FROM ".TABLE_PREFIX."objects o,".TABLE_PREFIX."project_files f WHERE o.id = f.object_id AND o.name = ".DB::escape($fName).""; $db_res = DB::execute($sql); $row = $db_res->fetchRow(); $file = ProjectFiles::findById($row['id']); DB::beginWork(); if ($file == null){ $fileIsNew = true; $file = new ProjectFile(); $file->setFilename($fName); $file->setIsVisible(true); $file->setMailId($email->getId()); $file->save(); $object_controller = new ObjectController(); $object_controller->add_to_members($file, array(), $account_owner); } else { $fileIsNew = false; } if($remove_prev){ $dim_ids = array(0); foreach ($members as $m) $dim_ids[$m->getDimensionId()] = $m->getDimensionId(); ObjectMembers::delete('`object_id` = ' . $file->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `'.TABLE_PREFIX.'members` `m` WHERE `m`.`dimension_id` IN ('.implode(',',$dim_ids).'))'); } $file->addToMembers($members); $file->addToSharingTable(); $enc = array_var($parsedMail,'Encoding','UTF-8'); $ext = utf8_substr($fName, strrpos($fName, '.') + 1, utf8_strlen($fName, $enc), $enc); $mime_type = ''; if (Mime_Types::instance()->has_type($att["content-type"])) { $mime_type = $att["content-type"]; //mime type is listed & valid } else { $mime_type = Mime_Types::instance()->get_type($ext); //Attempt to infer mime type } $userid = logged_user() ? logged_user()->getId() : "0"; $tempFileName = ROOT ."/tmp/". $userid ."x". gen_id(); $fh = fopen($tempFileName, 'w') or die("Can't open file"); fwrite($fh, $att["Data"]); fclose($fh); $fileToSave = array( "name" => $fName, "type" => $mime_type, "tmp_name" => $tempFileName, "error" => 0, "size" => filesize($tempFileName) ); if ($fileIsNew) { $revision = $file->handleUploadedFile($fileToSave, true, lang('attachment from email', $email->getSubject())); // handle uploaded file ApplicationLogs::createLog($file, ApplicationLogs::ACTION_ADD); }else{ $revision = $file->getLastRevision(); $new_hash = hash_file("sha256", $tempFileName); if ($revision->getHash() != $new_hash) { $revision = $file->handleUploadedFile($fileToSave, true, lang('attachment from email', $email->getSubject())); // handle uploaded file ApplicationLogs::createLog($file, ApplicationLogs::ACTION_ADD); } } DB::commit(); // Error... } catch(Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } }else{ flash_error(lang('file extension no allow classify', $fName)); } if (isset($tempFileName) && is_file($tempFileName)) unlink($tempFileName); } } }