642 lines
33 KiB
PHP
642 lines
33 KiB
PHP
|
<?php
|
||
|
/*********************************************************************************
|
||
|
*
|
||
|
* TimeTrex is a Workforce Management program developed by
|
||
|
* TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it under
|
||
|
* the terms of the GNU Affero General Public License version 3 as published by
|
||
|
* the Free Software Foundation with the addition of the following permission
|
||
|
* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
|
||
|
* WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
|
||
|
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||
|
* details.
|
||
|
*
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License along
|
||
|
* with this program; if not, see http://www.gnu.org/licenses or write to the Free
|
||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
* 02110-1301 USA.
|
||
|
*
|
||
|
*
|
||
|
* You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
|
||
|
* #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
|
||
|
*
|
||
|
*
|
||
|
* The interactive user interfaces in modified source and object code versions
|
||
|
* of this program must display Appropriate Legal Notices, as required under
|
||
|
* Section 5 of the GNU Affero General Public License version 3.
|
||
|
*
|
||
|
*
|
||
|
* In accordance with Section 7(b) of the GNU Affero General Public License
|
||
|
* version 3, these Appropriate Legal Notices must retain the display of the
|
||
|
* "Powered by TimeTrex" logo. If the display of the logo is not reasonably
|
||
|
* feasible for technical reasons, the Appropriate Legal Notices must display
|
||
|
* the words "Powered by TimeTrex".
|
||
|
*
|
||
|
********************************************************************************/
|
||
|
|
||
|
require_once( '../includes/global.inc.php' );
|
||
|
$skip_message_check = true;
|
||
|
require_once( Environment::getBasePath() . 'includes/Interface.inc.php' );
|
||
|
require_once( Environment::getBasePath() . 'classes/upload/fileupload.class.php' );
|
||
|
|
||
|
//PHP must have the upload and POST max sizes set to handle the largest file upload. If these are too low
|
||
|
//it errors out with a non-helpful error, so set these large and restrict the size in the Upload class.
|
||
|
//ini_set( 'upload_max_filesize', '128M' ); //This is PER DIRECTORY and therefore can't be set this way. Must be set in the PHP.INI or .htaccess files instead.
|
||
|
//ini_set( 'post_max_size', '128M' ); //This has no affect as its set too late. Must be set in the PHP.INI or .htaccess files instead.
|
||
|
|
||
|
extract( FormVariables::GetVariables(
|
||
|
[
|
||
|
'action',
|
||
|
'object_type',
|
||
|
'parent_object_type_id',
|
||
|
'object_id',
|
||
|
'parent_id',
|
||
|
'SessionID',
|
||
|
] ) );
|
||
|
|
||
|
if ( $authentication->checkValidCSRFToken() == false ) { //Help prevent CSRF attacks with this, run this check during and before the user is logged in.
|
||
|
echo TTi18n::getText( 'Invalid CSRF token!' );
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
$object_type = trim( strtolower( $object_type ) );
|
||
|
Debug::Text( 'Object Type: ' . $object_type . ' ID: ' . $object_id . ' Parent ID: ' . $parent_id . ' POST SessionID: ' . $SessionID, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
if ( Misc::doesRequestExceedPHPMaxPostSize() == true ) { //Check PHP maximum post/upload size limit and make sure that hasn't been exceeded first.
|
||
|
$error = TTi18n::gettext( 'ERROR: File size is too large, must be less than %1 bytes.', Misc::getPHPMaxUploadSize() );
|
||
|
} else {
|
||
|
$upload = new fileupload();
|
||
|
switch ( $object_type ) {
|
||
|
case 'invoice_config':
|
||
|
$max_upload_file_size = 5000000;
|
||
|
|
||
|
if ( $permission->Check( 'invoice_config', 'add' ) || $permission->Check( 'invoice_config', 'edit' ) || $permission->Check( 'invoice_config', 'edit_child' ) || $permission->Check( 'invoice_config', 'edit_own' ) ) {
|
||
|
if ( isset( $_POST['file_data'] ) ) {
|
||
|
Debug::Text( 'HTML5 Base64 encoded upload...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$allowed_upload_content_types = [ false, 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png' ];
|
||
|
|
||
|
$icf = TTnew( 'InvoiceConfigFactory' ); /** @var InvoiceConfigFactory $icf */
|
||
|
$icf->cleanStoragePath( $current_company->getId() );
|
||
|
$dir = $icf->getStoragePath( $current_company->getId() );
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 )
|
||
|
&& isset( $_POST['mime_type'] )
|
||
|
&& in_array( strtolower( trim( $_POST['mime_type'] ) ), $allowed_upload_content_types ) ) {
|
||
|
|
||
|
$file_name = $dir . DIRECTORY_SEPARATOR . 'logo.img';
|
||
|
$file_data = base64_decode( $_POST['file_data'] );
|
||
|
$file_size = strlen( $file_data );
|
||
|
|
||
|
if ( in_array( Misc::getMimeType( $file_data, true ), $allowed_upload_content_types ) ) {
|
||
|
if ( $file_size <= $max_upload_file_size ) {
|
||
|
$success = file_put_contents( $file_name, $file_data );
|
||
|
if ( $success == false ) {
|
||
|
Debug::Text( 'bUpload Failed! Unable to write data to: ' . $file_name, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Unable to upload photo' );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'cUpload Failed! File too large: ' . $file_size, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File size is too large, must be less than %1 bytes', $max_upload_file_size );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (b)';
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (a)';
|
||
|
}
|
||
|
}
|
||
|
unset( $uf, $ulf );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'document_revision':
|
||
|
Debug::Text( 'Document...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$max_upload_file_size = 128000000;
|
||
|
if ( isset( $parent_object_type_id ) && $parent_object_type_id == 400 ) {
|
||
|
$section = 'user_expense';
|
||
|
} else {
|
||
|
$section = 'document';
|
||
|
}
|
||
|
if ( DEMO_MODE == false && ( $permission->Check( $section, 'add' ) || $permission->Check( $section, 'edit' ) || $permission->Check( $section, 'edit_child' ) || $permission->Check( $section, 'edit_own' ) ) ) {
|
||
|
$permission_children_ids = $permission->getPermissionHierarchyChildren( $current_company->getId(), $current_user->getId() );
|
||
|
|
||
|
$drlf = TTnew( 'DocumentRevisionListFactory' ); /** @var DocumentRevisionListFactory $drlf */
|
||
|
$drlf->getByIdAndCompanyId( $object_id, $current_user->getCompany() );
|
||
|
if ( $drlf->getRecordCount() == 1 ) {
|
||
|
if ( $permission->Check( $section, 'edit' )
|
||
|
|| ( $permission->Check( $section, 'edit_own' ) && $permission->isOwner( $drlf->getCurrent()->getCreatedBy(), $drlf->getCurrent()->getID() ) === true )
|
||
|
|| ( $permission->Check( $section, 'edit_child' ) && $permission->isChild( $drlf->getCurrent()->getId(), $permission_children_ids ) === true ) ) {
|
||
|
|
||
|
$df = TTnew( 'DocumentFactory' ); /** @var DocumentFactory $df */
|
||
|
$drf = TTnew( 'DocumentRevisionFactory' ); /** @var DocumentRevisionFactory $drf */
|
||
|
|
||
|
//Debug::setVerbosity(11);
|
||
|
$upload->set_max_filesize( $max_upload_file_size ); //128mb or less, though I'm not 100% sure this is even working.
|
||
|
$upload->set_overwrite_mode( 3 ); //Do nothing
|
||
|
|
||
|
$dr_obj = $drlf->getCurrent();
|
||
|
$dr_obj->setLocalFileName();
|
||
|
$dir = $dr_obj->getStoragePath( $current_company->getId() );
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 ) ) {
|
||
|
$upload_result = $upload->upload( 'filedata', $dir ); //'filedata' is case sensitive
|
||
|
//Debug::Arr($_FILES, 'FILES Vars: ', __FILE__, __LINE__, __METHOD__, 10);
|
||
|
if ( $upload_result ) {
|
||
|
Debug::Text( 'Upload Success: ' . $upload_result, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$success = $upload_result . ' ' . TTi18n::gettext( 'Successfully Uploaded' );
|
||
|
$upload_file_arr = $upload->get_file();
|
||
|
} else {
|
||
|
Debug::Text( 'Upload Failed!: ' . $upload->get_error(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = $upload->get_error();
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'Upload Failed!: Not enough disk space available...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'ERROR: File is too large to be uploaded at this time. Please try again later.' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( isset( $success ) ) {
|
||
|
//Document Revision
|
||
|
Debug::Text( 'Upload File Name: ' . $upload_file_arr['name'] . ' Mime Type: ' . $upload_file_arr['type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
if ( $drlf->getRecordCount() == 1 ) {
|
||
|
$dr_obj->setRemoteFileName( $upload_file_arr['name'] );
|
||
|
$dr_obj->setMimeType( $dr_obj->detectMimeType( $upload_file_arr['name'], $upload_file_arr['type'] ) );
|
||
|
$dr_obj->setEnableFileUpload( true );
|
||
|
if ( $dr_obj->isValid() ) {
|
||
|
$dr_obj->Save( false );
|
||
|
$dr_obj->renameLocalFile(); //Rename after save as finished successfully, otherwise a validation error will occur because the src file is gone.
|
||
|
unset( $dr_obj );
|
||
|
break;
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: File is invalid, unable to save' );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'Object does not exist!', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'bUpload Failed!: ' . $upload->get_error(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Permission Denied' );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'company_logo':
|
||
|
Debug::Text( 'Company Logo...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$max_upload_file_size = 5000000;
|
||
|
|
||
|
if ( DEMO_MODE == false && ( $permission->Check( 'company', 'add' ) || $permission->Check( 'company', 'edit' ) || $permission->Check( 'company', 'edit_child' ) || $permission->Check( 'company', 'edit_own' ) ) ) {
|
||
|
if ( isset( $_POST['file_data'] ) ) { //Only required for images due the image wizard.
|
||
|
Debug::Text( 'HTML5 Base64 encoded upload...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$allowed_upload_content_types = [ false, 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png' ];
|
||
|
|
||
|
$cf = TTnew( 'CompanyFactory' ); /** @var CompanyFactory $cf */
|
||
|
$cf->cleanStoragePath( $current_company->getId() );
|
||
|
$dir = $cf->getStoragePath( $current_company->getId() );
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 )
|
||
|
&& isset( $_POST['mime_type'] )
|
||
|
&& in_array( strtolower( trim( $_POST['mime_type'] ) ), $allowed_upload_content_types ) ) {
|
||
|
$file_name = $dir . DIRECTORY_SEPARATOR . 'logo.img';
|
||
|
$file_data = base64_decode( $_POST['file_data'] );
|
||
|
$file_size = strlen( $file_data );
|
||
|
|
||
|
if ( in_array( Misc::getMimeType( $file_data, true ), $allowed_upload_content_types ) ) {
|
||
|
if ( $file_size <= $max_upload_file_size ) {
|
||
|
$success = file_put_contents( $file_name, $file_data );
|
||
|
if ( $success == false ) {
|
||
|
Debug::Text( 'bUpload Failed! Unable to write data to: ' . $file_name, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Unable to upload photo' );
|
||
|
} else {
|
||
|
TTLog::addEntry( $current_company->getId(), 10, TTi18n::getText( 'Logo - Source: Web' ), null, $cf->getTable() );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'cUpload Failed! File too large: ' . $file_size, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File size is too large, must be less than %1 bytes', $max_upload_file_size );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (b)';
|
||
|
}
|
||
|
} else {
|
||
|
if ( isset( $_POST['mime_type'] ) ) {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Text( 'eUpload Failed! Mime_type not specified...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (a)';
|
||
|
}
|
||
|
}
|
||
|
unset( $cf );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'legal_entity_logo':
|
||
|
Debug::Text( 'Legal Entity Logo...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$max_upload_file_size = 5000000;
|
||
|
|
||
|
if ( DEMO_MODE == false && ( $permission->Check( 'legal_entity', 'add' ) || $permission->Check( 'legal_entity', 'edit' ) || $permission->Check( 'legal_entity', 'edit_child' ) || $permission->Check( 'legal_entity', 'edit_own' ) ) ) {
|
||
|
if ( isset( $_POST['file_data'] ) && TTUUID::isUUID( $object_id ) ) { //Only required for images due the image wizard.
|
||
|
Debug::Text( 'HTML5 Base64 encoded upload...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$allowed_upload_content_types = [ false, 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png' ];
|
||
|
|
||
|
$lef = TTnew( 'LegalEntityFactory' ); /** @var LegalEntityFactory $lef */
|
||
|
$lef->cleanStoragePath( $object_id );
|
||
|
$dir = $lef->getStoragePath( $object_id );
|
||
|
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 )
|
||
|
&& isset( $_POST['mime_type'] )
|
||
|
&& in_array( strtolower( trim( $_POST['mime_type'] ) ), $allowed_upload_content_types ) ) {
|
||
|
$file_name = $dir . DIRECTORY_SEPARATOR . 'logo.img';
|
||
|
$file_data = base64_decode( $_POST['file_data'] );
|
||
|
$file_size = strlen( $file_data );
|
||
|
|
||
|
if ( in_array( Misc::getMimeType( $file_data, true ), $allowed_upload_content_types ) ) {
|
||
|
if ( $file_size <= $max_upload_file_size ) {
|
||
|
$success = file_put_contents( $file_name, $file_data );
|
||
|
if ( $success == false ) {
|
||
|
Debug::Text( 'bUpload Failed! Unable to write data to: ' . $file_name, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Unable to upload photo' );
|
||
|
} else {
|
||
|
TTLog::addEntry( $object_id, 10, TTi18n::getText( 'Logo - Source: Web' ), null, $lef->getTable() );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'cUpload Failed! File too large: ' . $file_size, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File size is too large, must be less than %1 bytes', $max_upload_file_size );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (b)';
|
||
|
}
|
||
|
} else {
|
||
|
if ( isset( $_POST['mime_type'] ) ) {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Text( 'eUpload Failed! Mime_type not specified...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (a)';
|
||
|
}
|
||
|
}
|
||
|
unset( $lef );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'user_photo':
|
||
|
Debug::Text( 'User Photo...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$max_upload_file_size = 25000000;
|
||
|
|
||
|
if ( DEMO_MODE == false && ( $permission->Check( 'user', 'add' ) || $permission->Check( 'user', 'edit' ) || $permission->Check( 'user', 'edit_child' ) || $permission->Check( 'user', 'edit_own' ) ) ) {
|
||
|
$permission_children_ids = $permission->getPermissionHierarchyChildren( $current_company->getId(), $current_user->getId() );
|
||
|
|
||
|
$ulf = TTnew( 'UserListFactory' ); /** @var UserListFactory $ulf */
|
||
|
$ulf->getByIdAndCompanyId( $object_id, $current_company->getId() );
|
||
|
if ( $ulf->getRecordCount() == 1
|
||
|
&&
|
||
|
( $permission->Check( 'user', 'edit' )
|
||
|
|| ( $permission->Check( 'user', 'edit_own' ) && $permission->isOwner( $ulf->getCurrent()->getCreatedBy(), $ulf->getCurrent()->getID() ) === true )
|
||
|
|| ( $permission->Check( 'user', 'edit_child' ) && $permission->isChild( $ulf->getCurrent()->getId(), $permission_children_ids ) === true ) ) ) {
|
||
|
|
||
|
if ( isset( $_POST['file_data'] ) ) { //Only required for images due the image wizard.
|
||
|
Debug::Text( 'HTML5 Base64 encoded upload...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$allowed_upload_content_types = [ false, 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png' ];
|
||
|
|
||
|
if ( $ulf->getRecordCount() == 1 ) {
|
||
|
$uf = TTnew( 'UserFactory' ); /** @var UserFactory $uf */
|
||
|
$uf->cleanStoragePath( $current_company->getId(), $object_id );
|
||
|
$dir = $uf->getStoragePath( $current_company->getId() );
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 )
|
||
|
&& isset( $_POST['mime_type'] )
|
||
|
&& in_array( strtolower( trim( $_POST['mime_type'] ) ), $allowed_upload_content_types ) ) {
|
||
|
$file_name = $dir . DIRECTORY_SEPARATOR . TTUUID::castUUID( $object_id ) . '.img';
|
||
|
$file_data = base64_decode( $_POST['file_data'] );
|
||
|
$file_size = strlen( $file_data );
|
||
|
|
||
|
if ( in_array( Misc::getMimeType( $file_data, true ), $allowed_upload_content_types ) ) {
|
||
|
if ( $file_size <= $max_upload_file_size ) {
|
||
|
$success = file_put_contents( $file_name, $file_data );
|
||
|
if ( $success == false ) {
|
||
|
Debug::Text( 'bUpload Failed! Unable to write data to: ' . $file_name, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Unable to upload photo' );
|
||
|
} else {
|
||
|
TTLog::addEntry( $object_id, 10, TTi18n::getText( 'Photo - Source: Web' ), null, $uf->getTable() );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'cUpload Failed! File too large: ' . $file_size, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File size is too large, must be less than %1 bytes', $max_upload_file_size );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (b)';
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (a)';
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
unset( $uf, $ulf );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'remittance_source_account':
|
||
|
Debug::Text( 'Remittance Source Account Signature...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$max_upload_file_size = 25000000;
|
||
|
|
||
|
if ( DEMO_MODE == false && ( $permission->Check( 'remittance_source_account', 'add' ) || $permission->Check( 'remittance_source_account', 'edit' ) || $permission->Check( 'remittance_source_account', 'edit_child' ) || $permission->Check( 'remittance_source_account', 'edit_own' ) ) ) {
|
||
|
$permission_children_ids = $permission->getPermissionHierarchyChildren( $current_company->getId(), $current_user->getId() );
|
||
|
|
||
|
$rsalf = TTnew( 'RemittanceSourceAccountListFactory' ); /** @var RemittanceSourceAccountListFactory $rsalf */
|
||
|
$rsalf->getByIdAndCompanyId( $object_id, $current_company->getId() );
|
||
|
if ( $rsalf->getRecordCount() == 1
|
||
|
&&
|
||
|
( $permission->Check( 'remittance_source_account', 'edit' )
|
||
|
|| ( $permission->Check( 'remittance_source_account', 'edit_own' ) && $permission->isOwner( $rsalf->getCurrent()->getCreatedBy(), $rsalf->getCurrent()->getID() ) === true )
|
||
|
|| ( $permission->Check( 'remittance_source_account', 'edit_child' ) && $permission->isChild( $rsalf->getCurrent()->getId(), $permission_children_ids ) === true ) ) ) {
|
||
|
|
||
|
if ( isset( $_POST['file_data'] ) ) { //Only required for images due the image wizard.
|
||
|
Debug::Text( 'HTML5 Base64 encoded upload...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$allowed_upload_content_types = [ false, 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png' ];
|
||
|
|
||
|
if ( $rsalf->getRecordCount() == 1 ) {
|
||
|
$rsaf = TTnew( 'RemittanceSourceAccountFactory' ); /** @var RemittanceSourceAccountFactory $rsaf */
|
||
|
$rsaf->cleanStoragePath( $current_company->getId(), $object_id );
|
||
|
$dir = $rsaf->getStoragePath( $current_company->getId() );
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 )
|
||
|
&& isset( $_POST['mime_type'] )
|
||
|
&& in_array( strtolower( trim( $_POST['mime_type'] ) ), $allowed_upload_content_types ) ) {
|
||
|
$file_name = $dir . DIRECTORY_SEPARATOR . TTUUID::castUUID( $object_id ) . '.img';
|
||
|
$file_data = base64_decode( $_POST['file_data'] );
|
||
|
$file_size = strlen( $file_data );
|
||
|
|
||
|
if ( in_array( Misc::getMimeType( $file_data, true ), $allowed_upload_content_types ) ) {
|
||
|
if ( $file_size <= $max_upload_file_size ) {
|
||
|
$success = file_put_contents( $file_name, $file_data );
|
||
|
if ( $success == false ) {
|
||
|
Debug::Text( 'bUpload Failed! Unable to write data to: ' . $file_name, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Unable to upload signature' );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'cUpload Failed! File too large: ' . $file_size, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File size is too large, must be less than %1 bytes', $max_upload_file_size );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (b)';
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'dUpload Failed! Incorrect mime_type: ' . $_POST['mime_type'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'Incorrect file type, must be a JPG or PNG image' ) . ' (a)';
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
unset( $rsaf, $rsalf );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Invalid Object ID' );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 'license':
|
||
|
//Always enable debug logging during license upload.
|
||
|
Debug::setEnable( true );
|
||
|
Debug::setBufferOutput( true );
|
||
|
Debug::setEnableLog( true );
|
||
|
Debug::setVerbosity( 10 );
|
||
|
|
||
|
$max_upload_file_size = 50000;
|
||
|
|
||
|
if ( getTTProductEdition() >= TT_PRODUCT_PROFESSIONAL ) {
|
||
|
if ( ( ( DEPLOYMENT_ON_DEMAND == false && $current_company->getId() == 1 ) || ( isset( $config_vars['other']['primary_company_id'] ) && $current_company->getId() == $config_vars['other']['primary_company_id'] ) ) ) {
|
||
|
if ( ( $permission->Check( 'company', 'add' ) || $permission->Check( 'company', 'edit' ) || $permission->Check( 'company', 'edit_own' ) || $permission->Check( 'company', 'edit_child' ) ) ) {
|
||
|
$upload->set_max_filesize( $max_upload_file_size ); //20K or less
|
||
|
$upload->set_acceptable_types( [ 'text/plain', 'plain/text', 'application/octet-stream' ] ); // comma separated string, or array
|
||
|
$upload->set_overwrite_mode( 1 );
|
||
|
|
||
|
$dir = Environment::getStorageBasePath() . DIRECTORY_SEPARATOR . 'license' . DIRECTORY_SEPARATOR . $current_company->getId();
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 ) ) {
|
||
|
$upload_result = $upload->upload( 'filedata', $dir );
|
||
|
//var_dump($upload ); //file data
|
||
|
if ( $upload_result ) {
|
||
|
$success = $upload_result . ' ' . TTi18n::gettext( 'Successfully Uploaded!' );
|
||
|
} else {
|
||
|
$error = $upload->get_error();
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'Upload Failed: Not enough disk space available...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'File is too large to be uploaded at this time.' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Debug::Text( 'Post Upload Operation...', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $success ) && $success != '' ) {
|
||
|
$clf = new CompanyListFactory();
|
||
|
$clf->getById( $config_vars['other']['primary_company_id'] );
|
||
|
if ( $clf->getRecordCount() == 1 ) {
|
||
|
$ttsc = new TimeTrexSoapClient();
|
||
|
|
||
|
$ping_key = uniqid();
|
||
|
|
||
|
if ( $ttsc->Ping( $ping_key ) == $ping_key ) {
|
||
|
Debug::Text( 'Initial Communication to license server successful!', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$file_data_arr = $upload->get_file();
|
||
|
$license_data = trim( file_get_contents( $dir . '/' . $upload_result ) );
|
||
|
|
||
|
$obj_class = "\124\124\114\x69\x63\x65\x6e\x73\x65"; $license = @new $obj_class;
|
||
|
$retval = $license->getLicenseFile( true, $license_data ); //Download updated license file if one exists.
|
||
|
if ( $retval === false ) {
|
||
|
$error = TTi18n::gettext( 'Invalid license file or unable to activate license.' );
|
||
|
unset( $success );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: Unable to communicate with license server, please check your internet connection.' );
|
||
|
unset( $success );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: Invalid PRIMARY_COMPANY_ID defined in timetrex.ini.php file.' );
|
||
|
unset( $success );
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: Permission Denied!' );
|
||
|
}
|
||
|
} else {
|
||
|
Debug::Text( 'Current Company ID: ' . $current_company->getId(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = TTi18n::gettext( 'ERROR: Not logged into primary company.' );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: Product Edition is invalid, must not be Community Edition.' );
|
||
|
}
|
||
|
break;
|
||
|
case 'import':
|
||
|
$max_upload_file_size = 128000000;
|
||
|
|
||
|
|
||
|
if ( ( DEMO_MODE == false || ( isset( $config_vars['other']['sandbox'] ) && $config_vars['other']['sandbox'] == true ) ) //Allow importing in sandbox mode, as its helpful to be able to test this.
|
||
|
&& (
|
||
|
$permission->Check( 'user', 'add' )
|
||
|
|| $permission->Check( 'user', 'edit_bank' )
|
||
|
|| $permission->Check( 'branch', 'add' )
|
||
|
|| $permission->Check( 'department', 'add' )
|
||
|
|| $permission->Check( 'wage', 'add' )
|
||
|
|| $permission->Check( 'pay_period_schedule', 'add' )
|
||
|
|| $permission->Check( 'schedule', 'add' )
|
||
|
|| $permission->Check( 'pay_stub_amendment', 'add' )
|
||
|
|| $permission->Check( 'accrual', 'add' )
|
||
|
|| $permission->Check( 'client', 'add' )
|
||
|
|| $permission->Check( 'job', 'add' )
|
||
|
|| $permission->Check( 'job_item', 'add' )
|
||
|
)
|
||
|
) {
|
||
|
$import = TTnew( 'Import' ); /** @var Import $import */
|
||
|
$import->company_id = $current_company->getId();
|
||
|
$import->user_id = $current_user->getId();
|
||
|
|
||
|
global $authentication;
|
||
|
if ( is_object( $authentication ) && $authentication->getSessionID() != '' ) {
|
||
|
Debug::text( 'Session ID: ' . $authentication->getSessionID(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$import->session_id = $authentication->getSessionID();
|
||
|
}
|
||
|
|
||
|
$import->deleteLocalFile(); //Make sure we delete the original file upon uploading, so if there is an error and the file upload is denied we don't show old files.
|
||
|
|
||
|
//Sometimes Excel uploads .CSV files as application/vnd.ms-excel
|
||
|
$valid_mime_types = [ 'text/plain', 'plain/text', 'text/comma-separated-values', 'text/csv', 'application/csv', 'text/anytext', 'text/x-c', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', 'application/vnd.oasis.opendocument.spreadsheet', 'application/octet-stream' ]; // comma separated string, or array. Should match Misc::parseCSV()
|
||
|
|
||
|
//Debug::setVerbosity(11);
|
||
|
$upload->set_max_filesize( $max_upload_file_size ); //128mb or less, though I'm not 100% sure this is even working.
|
||
|
//$upload->set_acceptable_types( $valid_mime_types ); //Ignore mime type sent by browser and use mime extension instead.
|
||
|
$upload->set_overwrite_mode( 1 ); //Overwrite
|
||
|
|
||
|
$dir = $import->getStoragePath();
|
||
|
Debug::Text( 'Storage Path: ' . $dir, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
if ( isset( $dir ) ) {
|
||
|
@mkdir( $dir, 0700, true );
|
||
|
|
||
|
if ( @disk_free_space( $dir ) > ( $max_upload_file_size * 2 ) ) {
|
||
|
$upload_result = $upload->upload( 'filedata', $dir ); //'filedata' is case sensitive
|
||
|
//Debug::Arr($_FILES, 'FILES Vars: ', __FILE__, __LINE__, __METHOD__, 10);
|
||
|
//Debug::Arr($upload->get_file(), 'File Upload Data: ', __FILE__, __LINE__, __METHOD__, 10);
|
||
|
if ( $upload_result ) {
|
||
|
$upload_file_arr = $upload->get_file();
|
||
|
//mime_content_type might not work properly on Windows. So if its not available just accept any file type.
|
||
|
$mime_type = ( function_exists( 'mime_content_type' ) ) ? mime_content_type( $dir . '/' . $upload_file_arr['name'] ) : false;
|
||
|
if ( $mime_type === false || in_array( $mime_type, $valid_mime_types ) ) {
|
||
|
$file_name = $import->getStoragePath() . DIRECTORY_SEPARATOR . $upload_file_arr['name'];
|
||
|
|
||
|
if ( in_array( $mime_type, [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', 'application/vnd.oasis.opendocument.spreadsheet' ] ) ) {
|
||
|
$convert_excel_to_csv = Misc::convertExcelToCSV( $file_name );
|
||
|
if ( $convert_excel_to_csv === false ) {
|
||
|
$error = TTi18n::gettext( 'ERROR: Unable to read uploaded spreadsheet file, try saving it as a CSV file instead.' );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( !isset( $error ) ) {
|
||
|
$max_file_line_count = 0;
|
||
|
if ( DEPLOYMENT_ON_DEMAND == true ) {
|
||
|
switch ( strtolower( $object_id ) ) {
|
||
|
case 'apiimportpunch':
|
||
|
$max_file_line_count = ( $current_company->getProductEdition() == 10 ) ? 500 : 2500; //Importing punches can be quite slow, so reduce this significantly.
|
||
|
break;
|
||
|
default:
|
||
|
$max_file_line_count = ( $current_company->getProductEdition() == 10 ) ? 100 : 10000;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$file_line_count = Misc::countLinesInFile( $file_name );
|
||
|
Debug::Text( 'Upload Success: ' . $upload_result . ' Full Path: ' . $file_name . ' Line Count: ' . $file_line_count . ' Max Lines: ' . $max_file_line_count, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
if ( $max_file_line_count > 0 && $file_line_count > $max_file_line_count ) {
|
||
|
$error = TTi18n::gettext( 'Import file exceeds the maximum number of allowed lines (%1), please reduce the number of lines and try again.', $max_file_line_count );
|
||
|
} else {
|
||
|
$success = $upload_result . ' ' . TTi18n::gettext( 'Successfully Uploaded' );
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'ERROR: Uploaded file is not a properly formatted CSV file compatible with importing. You uploaded a file of type' ) . ': ' . $mime_type;
|
||
|
}
|
||
|
unset( $mime_type );
|
||
|
} else {
|
||
|
Debug::Text( 'Upload Failed!: ' . $upload->get_error(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$error = $upload->get_error();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( isset( $success ) ) {
|
||
|
$import->setRemoteFileName( $upload_file_arr['name'] );
|
||
|
$import->renameLocalFile();
|
||
|
} else {
|
||
|
Debug::Text( 'bUpload Failed!: ' . $upload->get_error(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
} else {
|
||
|
$error = TTi18n::gettext( 'Permission Denied' );
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
$error = TTi18n::gettext( 'Invalid object_type' );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( isset( $success ) ) {
|
||
|
echo 'TRUE';
|
||
|
} else {
|
||
|
if ( isset( $error ) ) {
|
||
|
//In some cases the real path of the file could be included in the error message, revealing too much information.
|
||
|
//Try to remove the directory from the error message if it exists.
|
||
|
if ( isset( $dir ) && $dir != '' ) {
|
||
|
$error = str_replace( $dir, '', $error );
|
||
|
}
|
||
|
echo $error;
|
||
|
Debug::Text( 'Upload ERROR: ' . $error, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
if ( DEMO_MODE == true ) {
|
||
|
echo TTi18n::gettext( 'ERROR: Uploading files is disabled in DEMO mode.' );
|
||
|
} else {
|
||
|
echo TTi18n::gettext( 'ERROR: Unable to upload file!' );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|