diff --git a/.env.example b/.env.example index f6ad25fc1c89e3e33ffbe90e66f775665ce30e78..dee4985ccf5c495800adbe41fdf6499cdc81bcaf 100644 --- a/.env.example +++ b/.env.example @@ -85,10 +85,12 @@ REDIS_PORT-null # -------------------------------------------- # OPTIONAL: AWS S3 SETTINGS # -------------------------------------------- -AWS_SECRET=null -AWS_KEY=null -AWS_REGION=null +AWS_SECRET_ACCESS_KEY=null +AWS_ACCESS_KEY_ID=null +AWS_DEFAULT_REGION=null AWS_BUCKET=null +AWS_BUCKET_ROOT=null +AWS_URL=null # -------------------------------------------- # OPTIONAL: LOGIN THROTTLING diff --git a/.env.testing b/.env.testing index f84dd82e9fbfd1d8554962f6d0b5b6b36fb52039..980f24f09e17756ebb1a941b4334c3a0ed79e845 100644 --- a/.env.testing +++ b/.env.testing @@ -40,10 +40,12 @@ IMAGE_LIB=gd # -------------------------------------------- # OPTIONAL: AWS S3 SETTINGS # -------------------------------------------- -AWS_SECRET=null -AWS_KEY=null -AWS_REGION=null +AWS_SECRET_ACCESS_KEY=null +AWS_ACCESS_KEY_ID=null +AWS_DEFAULT_REGION=null AWS_BUCKET=null +AWS_BUCKET_ROOT=null +AWS_URL=null # -------------------------------------------- diff --git a/.env.testing-ci b/.env.testing-ci index b12a99d44290c8cb5d4fafab3a8d83d4e37ece75..978c1895a3ebe0dd01726af3801468b2a0e62721 100644 --- a/.env.testing-ci +++ b/.env.testing-ci @@ -40,10 +40,12 @@ IMAGE_LIB=gd # -------------------------------------------- # OPTIONAL: AWS S3 SETTINGS # -------------------------------------------- -AWS_SECRET=null -AWS_KEY=null -AWS_REGION=null +AWS_SECRET_ACCESS_KEY=null +AWS_ACCESS_KEY_ID=null +AWS_DEFAULT_REGION=null AWS_BUCKET=null +AWS_BUCKET_ROOT=null +AWS_URL=null # -------------------------------------------- diff --git a/app/Console/Commands/MoveUploadsToNewDisk.php b/app/Console/Commands/MoveUploadsToNewDisk.php new file mode 100644 index 0000000000000000000000000000000000000000..505e260ce0bab30e68aee199cc3d6e5285cdc533 --- /dev/null +++ b/app/Console/Commands/MoveUploadsToNewDisk.php @@ -0,0 +1,183 @@ +<?php + +namespace App\Console\Commands; + + +use Illuminate\Console\Command; +use Illuminate\Support\Facades\Storage; + +class MoveUploadsToNewDisk extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'snipeit:move-uploads {delete_local?}'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'This will move your uploaded files to whatever your current disk is.'; + + /** + * Create a new command instance. + * + * @return void + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + + if (config('filesystems.default')=='local') { + $this->error('Your current disk is set to local so we cannot proceed.'); + $this->warn("Please configure your .env settings for S3 or Rackspace, \nand change your FILESYSTEM_DISK value to 's3' or 'rackspace'."); + return false; + } + $delete_local = $this->argument('delete_local'); + + $public_uploads['accessories'] = glob('storage/app/public/accessories'."/*.*"); + $public_uploads['assets'] = glob('storage/app/public/assets'."/*.*"); + $public_uploads['avatars'] = glob('storage/app/public/avatars'."/*.*"); + $public_uploads['barcodes'] = glob('storage/app/public/barcodes'."/*.*"); + $public_uploads['categories'] = glob('storage/app/public/categories'."/*.*"); + $public_uploads['companies'] = glob('storage/app/public/companies'."/*.*"); + $public_uploads['components'] = glob('storage/app/public/components'."/*.*"); + $public_uploads['consumables'] = glob('storage/app/public/consumables'."/*.*"); + $public_uploads['departments'] = glob('storage/app/public/departments'."/*.*"); + $public_uploads['locations'] = glob('storage/app/public/locations'."/*.*"); + $public_uploads['manufacturers'] = glob('storage/app/public/manufacturers'."/*.*"); + $public_uploads['suppliers'] = glob('storage/app/public/suppliers'."/*.*"); + $public_uploads['assetmodels'] = glob('storage/app/public/models'."/*.*"); + + + // iterate files + foreach($public_uploads as $public_type => $public_upload) + { + $type_count = 0; + $this->info("\nThere are ".count($public_upload).' PUBLIC '.$public_type.' files.'); + + for ($i = 0; $i < count($public_upload); $i++) { + $type_count++; + $filename = basename($public_upload[$i]); + + try { + Storage::disk('public')->put($public_type.'/'.$filename, file_get_contents($public_upload[$i])); + $new_url = Storage::disk('public')->url($public_type.'/'.$filename, $filename); + $this->info($type_count.'. PUBLIC: '.$filename.' was copied to '.$new_url); + } catch (\Exception $e) { + \Log::debug($e); + $this->error($e); + } + + } + + } + + $logos = glob('public/uploads'."/logo*.*"); + $this->info("\nThere are ".count($logos).' files that might be logos.'); + $type_count=0; + + for ($l = 0; $l < count($logos); $l++) { + $type_count++; + $filename = basename($logos[$l]); + $new_url = Storage::disk('public')->url($logos[$l], file_get_contents($public_upload[$i])); + $this->info($type_count.'. LOGO: '.$filename.' was copied to '.$new_url); + } + + $private_uploads['assets'] = glob('storage/private_uploads/assets'."/*.*"); + $private_uploads['signatures'] = glob('storage/private_uploads/signatures'."/*.*"); + $private_uploads['audits'] = glob('storage/private_uploads/audits'."/*.*"); + $private_uploads['assetmodels'] = glob('storage/private_uploads/assetmodels'."/*.*"); + $private_uploads['imports'] = glob('storage/private_uploads/imports'."/*.*"); + $private_uploads['licenses'] = glob('storage/private_uploads/licenses'."/*.*"); + $private_uploads['users'] = glob('storage/private_uploads/users'."/*.*"); + + + foreach($private_uploads as $private_type => $private_upload) + { + $this->info("\nThere are ".count($private_upload).' PRIVATE '.$private_type.' files.'); + // $this->info(print_r($private_upload, true)); + + $type_count = 0; + for ($x = 0; $x < count($private_upload); $x++) { + $type_count++; + $filename = basename($private_upload[$x]); + + try { + Storage::disk('private_uploads')->put($private_type.'/'.$filename, file_get_contents($public_upload[$i])); + $new_url = Storage::url($private_type.'/'.$filename, $filename); + $this->info($type_count.'. PRIVATE: '.$filename.' was copied to '.$new_url); + + } catch (\Exception $e) { + \Log::debug($e); + $this->error($e); + } + + } + + } + + + if ($delete_local=='true') { + $public_delete_count = 0; + $private_delete_count = 0; + + $this->info("\n\n"); + $this->error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); + $this->warn("\nTHIS WILL DELETE ALL OF YOUR LOCAL UPLOADED FILES. \n\nThis cannot be undone, so you should take a backup of your system before you proceed.\n"); + $this->error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); + + if ($this->confirm("Do you wish to continue?")) { + + foreach($public_uploads as $public_type => $public_upload) { + + for ($i = 0; $i < count($public_upload); $i++) { + $filename = $public_upload[$i]; + try { + unlink($filename); + $public_delete_count++; + } catch (\Exception $e) { + \Log::debug($e); + $this->error($e); + } + + } + } + + foreach($private_uploads as $private_type => $private_upload) + { + + for ($i = 0; $i < count($private_upload); $i++) { + $filename = $private_upload[$i]; + try { + unlink($filename); + $private_delete_count++; + } catch (\Exception $e) { + \Log::debug($e); + $this->error($e); + } + + } + } + + $this->info($public_delete_count." PUBLIC local files and ".$private_delete_count." PRIVATE local files were delete from your filesystem."); + } + } + + + + + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 750369df55c497de1780651e44469bd67b2eb94d..ad2d6dcfd3e265cc8ced4048cc23131e337fcfba 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -32,6 +32,7 @@ class Kernel extends ConsoleKernel Commands\SyncAssetCounters::class, Commands\RestoreDeletedUsers::class, Commands\SendCurrentInventoryToUsers::class, + Commands\MoveUploadsToNewDisk::class, ]; /** diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index 53cceb46ac128841cec45609ae3ee3f2013f26c0..05702970641e3adf43365b2b4e9de09a783b46f8 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -9,6 +9,7 @@ use App\Models\Company; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use Redirect; +use Illuminate\Support\Facades\Storage; /** This controller handles all actions related to Accessories for * the Snipe-IT Asset Management application. @@ -170,6 +171,15 @@ class AccessoriesController extends Controller if ($accessory->hasUsers() > 0) { return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); } + + if ($accessory->image) { + try { + Storage::disk('public')->delete('accessories'.'/'.$accessory->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } + $accessory->delete(); return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.delete.success')); } diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 198e11e998d8c451c1b082b52e2371f6942a99dc..23cd29d2d0011e3efe1cf479e3d47ec4243ba796 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -15,6 +15,7 @@ use App\Models\License; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Storage; class AcceptanceController extends Controller { @@ -40,7 +41,7 @@ class AcceptanceController extends Controller { $acceptance = CheckoutAcceptance::find($id); if (is_null($acceptance)) { - return redirect()->reoute('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); + return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); } if (! $acceptance->isPending()) { @@ -70,7 +71,7 @@ class AcceptanceController extends Controller { $acceptance = CheckoutAcceptance::find($id); if (is_null($acceptance)) { - return redirect()->reoute('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); + return redirect()->route('account.accept')->with('error', trans('admin/hardware/message.does_not_exist')); } if (! $acceptance->isPending()) { @@ -92,13 +93,17 @@ class AcceptanceController extends Controller { /** * Get the signature and save it */ + + if (!Storage::exists('private_uploads/signatures')) Storage::makeDirectory('private_uploads/signatures', 775); + + + if ($request->filled('signature_output')) { - $path = config('app.private_uploads').'/signatures'; $sig_filename = "siglog-" .Str::uuid() . '-'.date('Y-m-d-his').".png"; $data_uri = e($request->input('signature_output')); $encoded_image = explode(",", $data_uri); $decoded_image = base64_decode($encoded_image[1]); - file_put_contents($path."/".$sig_filename, $decoded_image); + Storage::put('private_uploads/signatures/'.$sig_filename, (string)$decoded_image); } @@ -122,4 +127,4 @@ class AcceptanceController extends Controller { return redirect()->to('account/accept')->with('success', $return_msg); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php index c0011b61ae71b13c2be1e79e4f3285ff3948cbbf..289348f17c1aa22a8a1a940951d6d0c3023473a3 100644 --- a/app/Http/Controllers/Api/AssetModelsController.php +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -9,6 +9,7 @@ use Illuminate\Http\Request; use App\Http\Transformers\AssetModelsTransformer; use App\Http\Transformers\AssetsTransformer; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; /** @@ -177,7 +178,7 @@ class AssetModelsController extends Controller if ($assetmodel->image) { try { - unlink(public_path().'/uploads/models/'.$assetmodel->image); + Storage::disk('public')->delete('assetmodels/'.$assetmodel->image); } catch (\Exception $e) { \Log::error($e); } @@ -234,7 +235,7 @@ class AssetModelsController extends Controller $assetmodel->use_text .= ' (#'.e($assetmodel->model_number).')'; } - $assetmodel->use_image = ($settings->modellistCheckedValue('image') && ($assetmodel->image)) ? url('/').'/uploads/models/'.$assetmodel->image : null; + $assetmodel->use_image = ($settings->modellistCheckedValue('image') && ($assetmodel->image)) ? Storage::disk('public')->url('assetmodels/'.e($assetmodel->image)) : null; } return (new SelectlistTransformer)->transformSelectlist($assetmodels); diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index dbed7be798f88a74d46464bb97fa232cb5efedad..0b65508c5d6b84d20f0a2eec428e1067f751d97c 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Api; use App\Helpers\Helper; use App\Http\Controllers\Controller; -use App\Http\Requests\AssetRequest; use App\Http\Requests\AssetCheckoutRequest; use App\Http\Transformers\AssetsTransformer; use App\Models\Asset; @@ -400,7 +399,7 @@ class AssetsController extends Controller * @since [v4.0] * @return JsonResponse */ - public function store(AssetRequest $request) + public function store(Request $request) { $this->authorize('create', Asset::class); @@ -431,7 +430,7 @@ class AssetsController extends Controller // Update custom fields in the database. // Validation for these fields is handled through the AssetRequest form request $model = AssetModel::find($request->get('model_id')); - if ($model->fieldset) { + if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { $asset->{$field->convertUnicodeDbSlug()} = e($request->input($field->convertUnicodeDbSlug(), null)); } diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index 3a208c64ae8e4d5f10a2fede8213c2adf1b705d4..1cee93110c3c80845a0055f5801027601b0f69e2 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -8,6 +8,7 @@ use App\Helpers\Helper; use App\Models\Category; use App\Http\Transformers\CategoriesTransformer; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; class CategoriesController extends Controller { @@ -158,7 +159,7 @@ class CategoriesController extends Controller // This lets us have more flexibility in special cases like assets, where // they may not have a ->name value but we want to display something anyway foreach ($categories as $category) { - $category->use_image = ($category->image) ? url('/').'/uploads/categories/'.$category->image : null; + $category->use_image = ($category->image) ? Storage::disk('public')->url('categories/'.$category->image, $category->image) : null; } return (new SelectlistTransformer)->transformSelectlist($categories); diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index d2dc5990c89c5d0d7949f760415e87b816185ee6..6b1c63f54bc5eef1317171c555899df4acd6fdd9 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -178,7 +178,7 @@ class CompaniesController extends Controller // This lets us have more flexibility in special cases like assets, where // they may not have a ->name value but we want to display something anyway foreach ($companies as $company) { - $company->use_image = ($company->image) ? url('/').'/uploads/companies/'.$company->image : null; + $company->use_image = ($company->image) ? Storage::disk('public')->url('companies/'.$company->image, $company->image) : null; } return (new SelectlistTransformer)->transformSelectlist($companies); diff --git a/app/Http/Controllers/Api/CustomFieldsetsController.php b/app/Http/Controllers/Api/CustomFieldsetsController.php index f5cfafdf930c644b12ec12aa3c7cab7d1c490972..5ed916152205521298e95fba1acbe213bc5fa25d 100644 --- a/app/Http/Controllers/Api/CustomFieldsetsController.php +++ b/app/Http/Controllers/Api/CustomFieldsetsController.php @@ -16,7 +16,6 @@ use App\Http\Controllers\Controller; use App\Helpers\Helper; use App\Http\Transformers\CustomFieldsTransformer; use App\Http\Transformers\CustomFieldsetsTransformer; -use App\Http\Requests\AssetRequest; /** * This controller handles all actions related to Custom Asset Fieldsets for diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php index 50a03baffa26879dba987a0ca6775d70cee862b0..1d0e11dcf922be1431260a0022f19f3a15471a94 100644 --- a/app/Http/Controllers/Api/DepartmentsController.php +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -9,6 +9,7 @@ use App\Http\Transformers\DepartmentsTransformer; use App\Helpers\Helper; use Auth; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; class DepartmentsController extends Controller { @@ -152,7 +153,7 @@ class DepartmentsController extends Controller // This lets us have more flexibility in special cases like assets, where // they may not have a ->name value but we want to display something anyway foreach ($departments as $department) { - $department->use_image = ($department->image) ? url('/').'/uploads/departments/'.$department->image : null; + $department->use_image = ($department->image) ? Storage::disk('public')->url('departments/'.$department->image, $department->image) : null; } return (new SelectlistTransformer)->transformSelectlist($departments); diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index e18acf3a7b240efdbb0a1113863cc9606ec2738f..797df4d9ef522e4b8bc241004b97c660443b5d1d 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -15,6 +15,7 @@ use League\Csv\Reader; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Artisan; use App\Models\Asset; +use Illuminate\Support\Facades\Storage; class ImportController extends Controller { @@ -167,7 +168,7 @@ class ImportController extends Controller if ($import = Import::find($import_id)) { try { // Try to delete the file - unlink(config('app.private_uploads').'/imports/'.$import->file_path); + Storage::delete('imports/'.$import->file_path); $import->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.import.file_delete_success'))); diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php index 452b5b73b9c934ad390d75d0f64eac21a2710b7a..eaabc0ac3090b74c3d680635fac718f907b78b25 100644 --- a/app/Http/Controllers/Api/LocationsController.php +++ b/app/Http/Controllers/Api/LocationsController.php @@ -8,6 +8,7 @@ use App\Helpers\Helper; use App\Models\Location; use App\Http\Transformers\LocationsTransformer; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; class LocationsController extends Controller { @@ -203,7 +204,7 @@ class LocationsController extends Controller // they may not have a ->name value but we want to display something anyway foreach ($locations as $location) { $location->use_text = $location->name; - $location->use_image = ($location->image) ? url('/').'/uploads/locations/'.$location->image : null; + $location->use_image = ($location->image) ? Storage::disk('public')->url('locations/'.$location->image, $location->image): null; } return (new SelectlistTransformer)->transformSelectlist($locations); diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index a943cc21d484bdb8216230107f6fa7f89801318f..2d30b3d5f2c6a1f3106467c4ceef01113da45b98 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -9,6 +9,7 @@ use App\Models\Manufacturer; use App\Http\Transformers\DatatablesTransformer; use App\Http\Transformers\ManufacturersTransformer; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; class ManufacturersController extends Controller { @@ -166,7 +167,7 @@ class ManufacturersController extends Controller // they may not have a ->name value but we want to display something anyway foreach ($manufacturers as $manufacturer) { $manufacturer->use_text = $manufacturer->name; - $manufacturer->use_image = ($manufacturer->image) ? url('/').'/uploads/manufacturers/'.$manufacturer->image : null; + $manufacturer->use_image = ($manufacturer->image) ? Storage::disk('public')->url('manufacturers/'.$manufacturer->image, $manufacturer->image) : null; } return (new SelectlistTransformer)->transformSelectlist($manufacturers); diff --git a/app/Http/Controllers/Api/SuppliersController.php b/app/Http/Controllers/Api/SuppliersController.php index b79fda773f3f2bb24fc4c9f110d6de2fb4783e08..d15492b1bb2591d346fb25cdeba80f22765da08d 100644 --- a/app/Http/Controllers/Api/SuppliersController.php +++ b/app/Http/Controllers/Api/SuppliersController.php @@ -8,6 +8,7 @@ use App\Helpers\Helper; use App\Models\Supplier; use App\Http\Transformers\SuppliersTransformer; use App\Http\Transformers\SelectlistTransformer; +use Illuminate\Support\Facades\Storage; class SuppliersController extends Controller @@ -164,7 +165,7 @@ class SuppliersController extends Controller // they may not have a ->name value but we want to display something anyway foreach ($suppliers as $supplier) { $supplier->use_text = $supplier->name; - $supplier->use_image = ($supplier->image) ? url('/').'/uploads/suppliers/'.$supplier->image : null; + $supplier->use_image = ($supplier->image) ? Storage::disk('public')->url('suppliers/'.$supplier->image, $supplier->image) : null; } return (new SelectlistTransformer)->transformSelectlist($suppliers); diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 7fca6bf3af9e5271c78ad9760e30ac959c1a4c2f..f787f46542e817a43179ecfd865db319dfc7453a 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -283,6 +283,15 @@ class UsersController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets'))); } + // Remove the user's avatar if they have one + if (Storage::disk('public')->exists('avatars/'.$user->avatar)) { + try { + Storage::disk('public')->delete('avatars/'.$user->avatar); + } catch (\Exception $e) { + \Log::debug($e); + } + } + if ($user->delete()) { return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete'))); } diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index d97c36e137675913d5d4a48a400b8a8ad333bc36..790b8c9876d02b8a2959484adc3de7336484e14a 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -82,7 +82,7 @@ class AssetModelsController extends Controller $model->fieldset_id = e($request->input('custom_fieldset')); } - $model = $request->handleImages($model, app('models_upload_path')); + $model = $request->handleImages($model); // Was it created? if ($model->save()) { @@ -161,7 +161,7 @@ class AssetModelsController extends Controller } } - $model = $request->handleImages($model, app('models_upload_path')); + $model = $request->handleImages($model); if ($model->save()) { return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success')); @@ -194,7 +194,7 @@ class AssetModelsController extends Controller if ($model->image) { try { - unlink(public_path().'/uploads/models/'.$model->image); + Storage::disk('public')->delete('models/'.$model->image); } catch (\Exception $e) { \Log::error($e); } diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index 9f31b80dc81a6c5dd9f611fb49608673d670fd6a..bc7f808135bdf9bd1435a938274ddeeaa039ab3d 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -31,13 +31,14 @@ class AssetFilesController extends Controller $this->authorize('update', $asset); if ($request->hasFile('file')) { + + if (!Storage::exists('private_uploads/assets')) Storage::makeDirectory('private_uploads/assets', 775); + foreach ($request->file('file') as $file) { $extension = $file->getClientOriginalExtension(); - $filename = 'hardware-'.$asset->id.'-'.str_random(8); - $filename .= '-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; - - $file->storeAs('storage/private_uploads/assets', $filename); - $asset->logUpload($filename, e($request->get('notes'))); + $file_name = 'hardware-'.$asset->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; + Storage::put('private_uploads/assets/'.$file_name, $file); + $asset->logUpload($file_name, e($request->get('notes'))); } return redirect()->back()->with('success', trans('admin/hardware/message.upload.success')); } @@ -67,24 +68,25 @@ class AssetFilesController extends Controller ->header('Content-Type', 'text/plain'); } - $file = $log->get_src('assets'); + $file = 'private_uploads/assets/'.$log->filename; + \Log::debug('Checking for '.$file); if ($log->action_type =='audit') { - $file = $log->get_src('audits'); + $file = 'private_uploads/audits/'.$log->filename; } - if (!file_exists($file)) { + if (!Storage::exists($file)) { return response('File '.$file.' not found on server', 404) ->header('Content-Type', 'text/plain'); } if ($download != 'true') { - if ($contents = file_get_contents($file)) { - return Response::make($contents)->header('Content-Type', mime_content_type($file)); + if ($contents = file_get_contents(Storage::url($file))) { + return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file))); } return JsonResponse::create(["error" => "Failed validation: "], 500); } - return Response::download($file); + return Storage::download($file); } // Prepare the error message $error = trans('admin/hardware/message.does_not_exist', ['id' => $fileId]); @@ -114,7 +116,7 @@ class AssetFilesController extends Controller $this->authorize('update', $asset); $log = Actionlog::find($fileId); if (file_exists(base_path().'/'.$rel_path.'/'.$log->filename)) { - Storage::delete($rel_path.'/'.$log->filename); + Storage::disk('public')->delete($rel_path.'/'.$log->filename); } $log->delete(); return redirect()->back() diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index ce0fa18862c3a26d6e13f7cc12dc1b6863696217..1baf6235a70f6d8b287e4a41efc6562e2beafaf6 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Assets; use App\Helpers\Helper; use App\Http\Controllers\Controller; -use App\Http\Requests\AssetRequest; +use App\Http\Requests\ImageUploadRequest; use App\Models\Actionlog; use App\Models\Asset; use App\Models\AssetModel; @@ -33,6 +33,7 @@ use TCPDF; use Validator; use View; use App\Models\CheckoutRequest; +use Illuminate\Support\Facades\Storage; /** * This class controls all actions related to assets for @@ -106,7 +107,7 @@ class AssetsController extends Controller * @since [v1.0] * @return Redirect */ - public function store(AssetRequest $request) + public function store(ImageUploadRequest $request) { $this->authorize(Asset::class); @@ -138,48 +139,14 @@ class AssetsController extends Controller $asset->location_id = $request->input('rtd_location_id', null); } - // Create the image (if one was chosen.) - if ($request->hasFile('image')) { - $image = $request->input('image'); - - // After modification, the image is prefixed by mime info like the following: - // data:image/jpeg;base64,; This causes the image library to be unhappy, so we need to remove it. - $header = explode(';', $image, 2)[0]; - // Grab the image type from the header while we're at it. - $extension = substr($header, strpos($header, '/')+1); - // Start reading the image after the first comma, postceding the base64. - $image = substr($image, strpos($image, ',')+1); - - $file_name = str_random(25).".".$extension; - - $directory= public_path('uploads/assets/'); - // Check if the uploads directory exists. If not, try to create it. - if (!file_exists($directory)) { - mkdir($directory, 0755, true); - } - $path = public_path('uploads/assets/'.$file_name); - try { - Image::make($image)->resize(500, 500, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $asset->image = $file_name; - } catch (\Exception $e) { - \Input::flash(); - $messageBag = new \Illuminate\Support\MessageBag(); - $messageBag->add('image', $e->getMessage()); - \Session()->flash('errors', \Session::get('errors', new \Illuminate\Support\ViewErrorBag) - ->put('default', $messageBag)); - return response()->json(['image' => $e->getMessage()], 422); - } - } + $asset = $request->handleImages($asset); // Update custom fields in the database. // Validation for these fields is handled through the AssetRequest form request $model = AssetModel::find($request->get('model_id')); - if ($model->fieldset) { + if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { if ($field->field_encrypted=='1') { if (Gate::allows('admin')) { @@ -210,12 +177,11 @@ class AssetsController extends Controller $asset->checkOut($target, Auth::user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name')), $location); } // Redirect to the asset listing page - \Session::flash('success', trans('admin/hardware/message.create.success')); - return response()->json(['redirect_url' => route('hardware.index')]); + return redirect()->route('hardware.index') + ->with('success', trans('admin/hardware/message.create.success')); } - \Input::flash(); - \Session::flash('errors', $asset->getErrors()); - return response()->json(['errors' => $asset->getErrors()], 500); + return redirect()->back()->withInput()->withErrors($asset->getErrors()); + } /** @@ -293,7 +259,7 @@ class AssetsController extends Controller * @return Redirect */ - public function update(AssetRequest $request, $assetId = null) + public function update(ImageUploadRequest $request, $assetId = null) { // Check if the asset exists if (!$asset = Asset::find($assetId)) { @@ -338,38 +304,7 @@ class AssetsController extends Controller $asset->notes = $request->input('notes'); $asset->physical = '1'; - // Update the image - if ($request->filled('image')) { - $image = $request->input('image'); - // See postCreate for more explaination of the following. - $header = explode(';', $image, 2)[0]; - $extension = substr($header, strpos($header, '/')+1); - $image = substr($image, strpos($image, ',')+1); - - $directory= public_path('uploads/assets/'); - // Check if the uploads directory exists. If not, try to create it. - if (!file_exists($directory)) { - mkdir($directory, 0755, true); - } - - $file_name = str_random(25).".".$extension; - $path = public_path('uploads/assets/'.$file_name); - try { - Image::make($image)->resize(500, 500, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path); - $asset->image = $file_name; - } catch (\Exception $e) { - \Input::flash(); - $messageBag = new \Illuminate\Support\MessageBag(); - $messageBag->add('image', $e->getMessage()); - \Session()->flash('errors', \Session::get('errors', new \Illuminate\Support\ViewErrorBag) - ->put('default', $messageBag)); - return response()->json(['image' => $e->getMessage()], 422); - } - $asset->image = $file_name; - } + $asset = $request->handleImages($asset); // Update custom fields in the database. // Validation for these fields is handlded through the AssetRequest form request @@ -421,6 +356,14 @@ class AssetsController extends Controller ->where('id', $asset->id) ->update(array('assigned_to' => null)); + if ($asset->image) { + try { + Storage::disk('public')->delete('assets'.'/'.$asset->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } + $asset->delete(); return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); @@ -740,7 +683,7 @@ class AssetsController extends Controller } - public function auditStore(AssetFileRequest $request, $id) + public function auditStore(Request $request, $id) { $this->authorize('audit', Asset::class); @@ -773,22 +716,15 @@ class AssetsController extends Controller if ($asset->save()) { + $path = 'private_uploads/audits'; + if (!Storage::exists($path)) Storage::makeDirectory($path, 775); - $filename = ''; - - if ($request->hasFile('image')) { - $file = $request->file('image'); - try { - $destinationPath = config('app.private_uploads').'/audits'; - $extension = $file->getClientOriginalExtension(); - $filename = 'audit-'.$asset->id.'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; - $file->move($destinationPath, $filename); - } catch (\Exception $e) { - \Log::error($e); - } - } + $upload = $image = $request->file('image'); + $ext = $image->getClientOriginalExtension(); + $file_name = 'audit-'.str_random(18).'.'.$ext; + Storage::putFileAs($path, $upload, $file_name); - $asset->logAudit($request->input('note'), $request->input('location_id'), $filename); + $asset->logAudit($request->input('note'), $request->input('location_id'), $file_name); return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success')); } } diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 2de5fd9a50c92b7ff38f9a8f060e12c986940023..bc643841e9dbbff40418b191e66810bc77af88e1 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -17,6 +17,7 @@ use Str; use View; use Image; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; /** * This class controls all actions related to Categories for @@ -182,7 +183,7 @@ class CategoriesController extends Controller return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=>'component'])); } - + Storage::disk('public')->delete('categories'.'/'.$category->image); $category->delete(); // Redirect to the locations management page return redirect()->route('categories.index')->with('success', trans('admin/categories/message.delete.success')); diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index 2ca0d15499a6e4f41650d92cb3b4630d9ee10e35..1e6a8473d33ca36cef2997a091e05c98f301f5e6 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -5,6 +5,7 @@ use App\Models\Company; use Illuminate\Http\Request; use Image; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to Companies for @@ -142,6 +143,15 @@ final class CompaniesController extends Controller } try { + + if ($company->image) { + try { + Storage::disk('public')->delete('companies'.'/'.$company->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } + $company->delete(); return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.delete.success')); diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 9e7d5d5a3a27f7e4aea51141d44f6338dcab010b..6839e1604d9474ed53de4d533c078b89a1bd7fde 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -7,6 +7,7 @@ use App\Models\Company; use App\Models\Component; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Storage; /** * This class controls all actions related to Components for @@ -159,6 +160,16 @@ class ComponentsController extends Controller } $this->authorize('delete', $component); + + // Remove the image if one exists + if (Storage::disk('public')->exists('components/'.$component->image)) { + try { + Storage::disk('public')->delete('components/'.$component->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } + $component->delete(); return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); } diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index 0922c412556bbfb085fe346d6c1544262b52583c..4afcd2a5a9f262261a4e34f0f8685d3dad3fb805 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -7,6 +7,7 @@ use App\Models\Department; use Illuminate\Support\Facades\Auth; use Image; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; class DepartmentsController extends Controller { @@ -124,7 +125,15 @@ class DepartmentsController extends Controller return redirect()->to(route('departments.index'))->with('error', trans('admin/departments/message.assoc_users')); } + if ($department->image) { + try { + Storage::disk('public')->delete('departments'.'/'.$department->image); + } catch (\Exception $e) { + \Log::debug($e); + } + } $department->delete(); + return redirect()->back()->with('success', trans('admin/departments/message.delete.success')); } diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index a25b15ada278a1a38d39713014ae5af3c486c18c..4ff388335b9d32f45ce7fc3a24a101a4e11a8b50 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -35,16 +35,20 @@ class LicenseFilesController extends Controller $this->authorize('update', $license); if (Input::hasFile('file')) { + + if (!Storage::exists('private_uploads/licenses')) Storage::makeDirectory('private_uploads/licenses', 775); + $upload_success = false; foreach (Input::file('file') as $file) { $extension = $file->getClientOriginalExtension(); - $filename = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; + $file_name = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; - $upload_success = $file->storeAs('storage/private_uploads/licenses', $filename); + $upload_success = Storage::put('private_uploads/licenses/'.$file_name, $file); //Log the upload to the log - $license->logUpload($filename, e($request->input('notes'))); + $license->logUpload($file_name, e($request->input('notes'))); } + // This being called from a modal seems to confuse redirect()->back() // It thinks we should go to the dashboard. As this is only used // from the modal at present, hardcode the redirect. Longterm @@ -76,15 +80,20 @@ class LicenseFilesController extends Controller { $license = License::find($licenseId); - $rel_path = 'storage/private_uploads/licenses'; - // the asset is valid if (isset($license->id)) { $this->authorize('update', $license); $log = Actionlog::find($fileId); - if (file_exists(base_path().'/'.$rel_path.'/'.$log->filename)) { - Storage::delete($rel_path.'/'.$log->filename); + + // Remove the file if one exists + if (Storage::exists('licenses/'.$log->filename)) { + try { + Storage::delete('licenses/'.$log->filename); + } catch (\Exception $e) { + \Log::debug($e); + } } + $log->delete(); return redirect()->back() ->with('success', trans('admin/hardware/message.deletefile.success')); @@ -114,34 +123,30 @@ class LicenseFilesController extends Controller // the license is valid if (isset($license->id)) { $this->authorize('view', $license); - $log = Actionlog::find($fileId); - $file = $log->get_src('licenses'); - - if ($file =='') { - return response('File not found on server', 404) + if (!$log = Actionlog::find($fileId)) { + return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } - $mimetype = \File::mimeType($file); + $file = 'private_uploads/licenses/'.$log->filename; + \Log::debug('Checking for '.$file); - - if (!file_exists($file)) { + if (!Storage::exists($file)) { return response('File '.$file.' not found on server', 404) ->header('Content-Type', 'text/plain'); } if ($download != 'true') { - if ($contents = file_get_contents($file)) { - return Response::make($contents)->header('Content-Type', $mimetype); + if ($contents = file_get_contents(Storage::url($file))) { + return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file))); } return JsonResponse::create(["error" => "Failed validation: "], 500); } - return Response::download($file); + return Storage::download($file); } + return redirect()->route('hardware.index')->with('error', trans('admin/licenses/message.does_not_exist', ['id' => $fileId])); - - return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); } diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index 87ff779eb4190cf71deb02988ada6e74dc3d998d..9314ede8b69811f018f667a41cc8598ee87e47cc 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -6,6 +6,7 @@ use App\Models\Location; use Illuminate\Support\Facades\Auth; use Image; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to Locations for @@ -89,7 +90,7 @@ class LocationsController extends Controller $location->manager_id = $request->input('manager_id'); $location->user_id = Auth::id(); - $location = $request->handleImages($location); + $location = $request->handleImages($location, 'public/uploads/locations'); if ($location->save()) { return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); @@ -159,7 +160,7 @@ class LocationsController extends Controller $location->ldap_ou = $request->input('ldap_ou'); $location->manager_id = $request->input('manager_id'); - $location = $request->handleImages($location); + $location = $request->handleImages($location, 'public/uploads/locations'); if ($location->save()) { @@ -198,6 +199,13 @@ class LocationsController extends Controller } + if ($location->image) { + try { + Storage::disk('public')->delete('locations/'.$location->image); + } catch (\Exception $e) { + \Log::error($e); + } + } $location->delete(); return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); } diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 1bbd4466d48eeba649cbab39e9980b5abf4d1f2a..c99ac10d95ab7443c833654ae27b2b232efbea53 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Auth; use Redirect; use Illuminate\Http\Request; use Image; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to Manufacturers for @@ -72,7 +73,7 @@ class ManufacturersController extends Controller $manufacturer->support_email = $request->input('support_email'); - $manufacturer = $request->handleImages($manufacturer); + $manufacturer = $request->handleImages($manufacturer,'manufacturers'); @@ -162,9 +163,9 @@ class ManufacturersController extends Controller if ($manufacturer->image) { try { - unlink(public_path().'/uploads/manufacturers/'.$manufacturer->image); + Storage::disk('public')->delete('manufacturers/'.$manufacturer->image); } catch (\Exception $e) { - + \Log::error($e); } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 492b65db0b697dc2387f61e35bfd2b187a0a461b..5b0a06ede384c077ab1b0692d7be7949323a5488 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -12,6 +12,7 @@ use Gate; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to User Profiles for @@ -61,19 +62,39 @@ class ProfileController extends Controller if (Gate::allows('self.edit_location') && (!config('app.lock_passwords'))) { $user->location_id = $request->input('location_id'); } - - if (Input::file('avatar')) { - $image = Input::file('avatar'); - $file_name = str_slug($user->first_name."-".$user->last_name).".".$image->getClientOriginalExtension(); - $path = public_path('uploads/avatars/'.$file_name); - Image::make($image->getRealPath())->resize(84, 84)->save($path); - $user->avatar = $file_name; - } - if (Input::get('avatar_delete') == 1 && Input::file('avatar') == "") { + + if ($request->input('avatar_delete') == 1) { $user->avatar = null; } + + if ($request->hasFile('avatar')) { + $path = 'avatars'; + + if(!Storage::disk('public')->exists($path)) Storage::disk('public')->makeDirectory($path, 775); + + $upload = $image = $request->file('avatar'); + $ext = $image->getClientOriginalExtension(); + $file_name = 'avatar-'.str_random(18).'.'.$ext; + + if ($image->getClientOriginalExtension()!='svg') { + $upload = Image::make($image->getRealPath())->resize(84, 84); + } + + // This requires a string instead of an object, so we use ($string) + Storage::disk('public')->put($path.'/'.$file_name, (string)$upload->encode()); + + // Remove Current image if exists + if (($user->avatar) && (Storage::disk('public')->exists($path.'/'.$user->avatar))) { + Storage::disk('public')->delete($path.'/'.$user->avatar); + } + + $user->avatar = $file_name; + } + + + if ($user->save()) { return redirect()->route('profile')->with('success', 'Account successfully updated'); } diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 90391a23f86a94d3a0b795dd60ba6d03d9f864b9..067bbd5624c746d955fafb4f37432bd39162c50e 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -24,6 +24,7 @@ use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\SettingsLdapRequest; use App\Helpers\Helper; use App\Notifications\FirstAdminNotification; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to Settings for @@ -418,25 +419,32 @@ class SettingsController extends Controller // If the user wants to clear the logo, reset the brand type if ($request->input('clear_logo')=='1') { + Storage::disk('public')->delete($setting->logo); $setting->logo = null; $setting->brand = 1; + // If they are uploading an image, validate it and upload it } elseif ($request->hasFile('image')) { - if (!config('app.lock_passwords')) { - $image = $request->file('image'); - $file_name = "logo.".$image->getClientOriginalExtension(); - $path = public_path('uploads'); - if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(null, 150, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - })->save($path.'/'.$file_name); - } else { - $image->move($path, $file_name); - } - $setting->logo = $file_name; + $image = $request->file('image'); + $ext = $image->getClientOriginalExtension(); + $setting->logo = $file_name = 'logo.'.$ext; + + if ($image->getClientOriginalExtension()!='svg') { + $upload = Image::make($image->getRealPath())->resize(null, 150, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + }); + } + + + // This requires a string instead of an object, so we use ($string) + Storage::disk('public')->put($file_name, (string)$upload->encode()); + + // Remove Current image if exists + if (($setting->logo) && (file_exists($file_name))) { + Storage::disk('public')->delete($file_name); } } @@ -911,29 +919,22 @@ class SettingsController extends Controller public function getBackups() { - $path = storage_path().'/app/'.config('backup.backup.name'); + $path = 'backups'; + $backup_files = Storage::files($path); + $files = []; - $files = array(); + if (count($backup_files) > 0) { - if ($handle = opendir($path)) { - - /* This is the correct way to loop over the directory. */ - while (false !== ($entry = readdir($handle))) { - clearstatcache(); - if (substr(strrchr($entry, '.'), 1)=='zip') { - $files[] = array( - 'filename' => $entry, - 'filesize' => Setting::fileSizeConvert(filesize($path.'/'.$entry)), - 'modified' => filemtime($path.'/'.$entry) - ); - } + for ($f = 0; $f < count($backup_files); $f++) { + $files[] = array( + 'filename' => basename($backup_files[$f]), + 'filesize' => Setting::fileSizeConvert(Storage::size($backup_files[$f])), + 'modified' => Storage::lastModified($backup_files[$f]) + ); } - closedir($handle); - rsort($files); } - return view('settings/backups', compact('path', 'files')); } @@ -987,12 +988,10 @@ class SettingsController extends Controller public function downloadFile($filename = null) { if (!config('app.lock_passwords')) { - $path = storage_path().'/app/'.config('backup.backup.name'); - $file = $path.'/'.$filename; - if (file_exists($file)) { - return Response::download($file); - } else { + if (Storage::exists($filename)) { + return Response::download(Storage::url('').e($filename)); + } else { // Redirect to the backup page return redirect()->route('settings.backups.index')->with('error', trans('admin/settings/message.backup.file_not_found')); } @@ -1013,14 +1012,17 @@ class SettingsController extends Controller */ public function deleteFile($filename = null) { - if (!config('app.lock_passwords')) { + $path = 'backups'; + + if (Storage::exists($path.'/'.$filename)) { + try { + Storage::delete($path.'/'.$filename); + return redirect()->route('settings.backups.index')->with('success', trans('admin/settings/message.backup.file_deleted')); + } catch (\Exception $e) { + \Log::debug($e); + } - $path = storage_path().'/app/'.config('backup.backup.name'); - $file = $path.'/'.$filename; - if (file_exists($file)) { - unlink($file); - return redirect()->route('settings.backups.index')->with('success', trans('admin/settings/message.backup.file_deleted')); } else { return redirect()->route('settings.backups.index')->with('error', trans('admin/settings/message.backup.file_not_found')); } diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index 5af0097ee3eba5555fd2a4473d3eedcd8ef455d4..985c2d892a83a37d937674fc2f062f40e39e85cc 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -6,6 +6,7 @@ use App\Models\Supplier; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use App\Http\Requests\ImageUploadRequest; +use Illuminate\Support\Facades\Storage; /** * This controller handles all actions related to Suppliers for diff --git a/app/Http/Requests/AssetRequest.php b/app/Http/Requests/AssetRequest.php deleted file mode 100644 index 4004dcec3f66bbedb7c0c0ee046771836bd9db6d..0000000000000000000000000000000000000000 --- a/app/Http/Requests/AssetRequest.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -namespace App\Http\Requests; - -use App\Http\Requests\Request; -use App\Models\AssetModel; -use Session; - -class AssetRequest extends Request -{ - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules() - { - $rules = [ - 'name' => 'max:255|nullable', - 'model_id' => 'required|integer|exists:models,id', - 'status_id' => 'required|integer|exists:status_labels,id', - 'company_id' => 'integer|nullable', - 'warranty_months' => 'numeric|nullable', - 'physical' => 'integer|nullable', - 'checkout_date' => 'date', - 'checkin_date' => 'date', - 'supplier_id' => 'integer|nullable', - 'status' => 'integer|nullable', - 'purchase_cost' => 'numeric|nullable', - "assigned_user" => 'sometimes:required_without_all:assigned_asset,assigned_location', - "assigned_asset" => 'sometimes:required_without_all:assigned_user,assigned_location', - "assigned_location" => 'sometimes:required_without_all:assigned_user,assigned_asset', - ]; - - $settings = \App\Models\Setting::getSettings(); - - $rules['asset_tag'] = ($settings->auto_increment_assets == '1') ? 'max:255' : 'required'; - - if($this->request->get('model_id') != '') { - $model = AssetModel::find($this->request->get('model_id')); - - if (($model) && ($model->fieldset)) { - $rules += $model->fieldset->validation_rules(); - } - } - - return $rules; - - } - - public function response(array $errors) - { - $this->session()->flash('errors', Session::get('errors', new \Illuminate\Support\ViewErrorBag) - ->put('default', new \Illuminate\Support\MessageBag($errors))); - \Input::flash(); - return parent::response($errors); - } -} diff --git a/app/Http/Requests/ImageUploadRequest.php b/app/Http/Requests/ImageUploadRequest.php index a01df7b4f5f4175f518331faf08e33bad2eb29b9..19a5453316d81865fbf90b7659ee8908acae0e11 100644 --- a/app/Http/Requests/ImageUploadRequest.php +++ b/app/Http/Requests/ImageUploadRequest.php @@ -4,6 +4,8 @@ namespace App\Http\Requests; use App\Models\SnipeModel; use Intervention\Image\Facades\Image; +use Storage; +use Illuminate\Support\Facades\File; class ImageUploadRequest extends Request { @@ -41,36 +43,44 @@ class ImageUploadRequest extends Request * @param String $path location for uploaded images, defaults to uploads/plural of item type. * @return SnipeModel Target asset is being checked out to. */ - public function handleImages($item, $path = null) + public function handleImages($item, $w = 550, $path = null) { + $type = strtolower(class_basename(get_class($item))); + + if(is_null($path)) { + $path = str_plural($type); + } + + if ($this->hasFile('image')) { if (!config('app.lock_passwords')) { - if(is_null($path)) { - $type = strtolower(class_basename(get_class($item))); - $plural = str_plural($type); - $path = public_path('/uploads/'.$plural); - } - $image = $this->file('image'); + + if(!Storage::disk('public')->exists($path)) Storage::disk('public')->makeDirectory($path, 775); + + $upload = $image = $this->file('image'); $ext = $image->getClientOriginalExtension(); $file_name = $type.'-'.str_random(18).'.'.$ext; + if ($image->getClientOriginalExtension()!='svg') { - Image::make($image->getRealPath())->resize(null, 250, function ($constraint) { + $upload = Image::make($image->getRealPath())->resize(null, $w, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); - })->save($path.'/'.$file_name); - } else { - $image->move($path, $file_name); + }); } - // Remove Current image if exists. + // This requires a string instead of an object, so we use ($string) + Storage::disk('public')->put($path.'/'.$file_name, (string)$upload->encode()); + + // Remove Current image if exists if (($item->image) && (file_exists($path.'/'.$item->image))) { - unlink($path.'/'.$item->image); + Storage::disk('public')->delete($path.'/'.$file_name); } $item->image = $file_name; } } elseif ($this->input('image_delete')=='1') { + Storage::disk('public')->delete($path.'/'.$item->image); $item->image = null; } return $item; diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index a4e935dab1a1134a4067ef394286aeac2e01ea05..1f828bd1eb997c45eafb6b1305effaa4233ea8e8 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -5,6 +5,7 @@ use App\Models\Accessory; use Gate; use Illuminate\Database\Eloquent\Collection; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class AccessoriesTransformer { @@ -23,6 +24,7 @@ class AccessoriesTransformer $array = [ 'id' => $accessory->id, 'name' => e($accessory->name), + 'image' => ($accessory->image) ? Storage::disk('public')->url('accessories/'.e($accessory->image)) : null, 'company' => ($accessory->company) ? ['id' => $accessory->company->id,'name'=> e($accessory->company->name)] : null, 'manufacturer' => ($accessory->manufacturer) ? ['id' => $accessory->manufacturer->id,'name'=> e($accessory->manufacturer->name)] : null, 'supplier' => ($accessory->supplier) ? ['id' => $accessory->supplier->id,'name'=> e($accessory->supplier->name)] : null, @@ -36,7 +38,7 @@ class AccessoriesTransformer 'order_number' => ($accessory->order_number) ? e($accessory->order_number) : null, 'min_qty' => ($accessory->min_amt) ? (int) $accessory->min_amt : null, 'remaining_qty' => $accessory->numRemaining(), - 'image' => ($accessory->image) ? url('/').'/uploads/accessories/'.e($accessory->image) : null, + 'created_at' => Helper::getFormattedDateObject($accessory->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($accessory->updated_at, 'datetime'), diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 53ece05583c9bbe5b7145a0cdd1ac33edf8485f2..c5ea16f59837bd8051422b9b6c4c7e34bfaa080b 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -63,7 +63,7 @@ class ActionlogsTransformer ] : null, 'note' => ($actionlog->note) ? e($actionlog->note): null, - 'signature_file' => ($actionlog->accept_signature) ? route('log.signature.view', ['filename' => $actionlog->accept_signature ]) : null, + 'signature_file' => ($actionlog->signature_filename) ? route('log.signature.view', ['filename' => $actionlog->signature_filename ]) : null, 'log_meta' => ($actionlog->log_meta) ? json_decode($actionlog->log_meta): null, diff --git a/app/Http/Transformers/AssetModelsTransformer.php b/app/Http/Transformers/AssetModelsTransformer.php index 2bb0a9e1a9c10cff7b2b5cdcd818f2098d9cea47..a344e76d03a3c452ac8cd870c7f69686c7752db9 100644 --- a/app/Http/Transformers/AssetModelsTransformer.php +++ b/app/Http/Transformers/AssetModelsTransformer.php @@ -5,6 +5,7 @@ use App\Models\AssetModel; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class AssetModelsTransformer { @@ -28,7 +29,7 @@ class AssetModelsTransformer 'id' => (int) $assetmodel->manufacturer->id, 'name'=> e($assetmodel->manufacturer->name) ] : null, - 'image' => ($assetmodel->image!='') ? app('models_upload_url').e($assetmodel->image) : null, + 'image' => ($assetmodel->image!='') ? Storage::disk('public')->url('assetmodels/'.e($assetmodel->image)) : null, 'model_number' => e($assetmodel->model_number), 'depreciation' => ($assetmodel->depreciation) ? [ 'id' => (int) $assetmodel->depreciation->id, diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php index 710bf84bc5bd9b13c3b45acbc8eaac97fb31f9a9..b93790f7710a6b6292e33538fc513f2d09c8dec2 100644 --- a/app/Http/Transformers/CategoriesTransformer.php +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -5,6 +5,7 @@ use App\Models\Category; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class CategoriesTransformer { @@ -25,7 +26,7 @@ class CategoriesTransformer $array = [ 'id' => (int) $category->id, 'name' => e($category->name), - 'image' => ($category->image) ? app('categories_upload_url').e($category->image) : null, + 'image' => ($category->image) ? Storage::disk('public')->url('categories/'.e($category->image)) : null, 'category_type' => e($category->category_type), 'eula' => ($category->getEula()) ? true : false, 'checkin_email' => ($category->checkin_email =='1') ? true : false, diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php index 96951bdf855a5ef6fd3bfaa769b5cf471e3e10b9..7fac8ee6d065f960ae6a8c7f6fd9c1c7191b7ccc 100644 --- a/app/Http/Transformers/CompaniesTransformer.php +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -5,6 +5,7 @@ use App\Models\Company; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class CompaniesTransformer { @@ -25,7 +26,7 @@ class CompaniesTransformer $array = [ 'id' => (int) $company->id, 'name' => e($company->name), - 'image' => ($company->image) ? app('companies_upload_url').e($company->image) : null, + 'image' => ($company->image) ? Storage::disk('public')->url('companies/'.e($company->image)) : null, "created_at" => Helper::getFormattedDateObject($company->created_at, 'datetime'), "updated_at" => Helper::getFormattedDateObject($company->updated_at, 'datetime'), "assets_count" => (int) $company->assets_count, diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index cf51b55d79f7b3e4ed7394bce08259412d16e0f8..6cd4b98c7048def6e25182d3d71f58cd564b48c9 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -5,6 +5,7 @@ use App\Models\Component; use Illuminate\Database\Eloquent\Collection; use App\Helpers\Helper; use Gate; +use Illuminate\Support\Facades\Storage; class ComponentsTransformer { @@ -22,7 +23,7 @@ class ComponentsTransformer $array = [ 'id' => (int) $component->id, 'name' => e($component->name), - 'image' => ($component->image) ? e(url('/').'/uploads/components/'.e($component->image)) : null, + 'image' => ($component->image) ? Storage::disk('public')->url('components/'.e($component->image)) : null, 'serial' => ($component->serial) ? e($component->serial) : null, 'location' => ($component->location) ? [ 'id' => (int) $component->location->id, diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 3d68697a58c8c531829f3e32e7cca867e9f58429..36ec8d9c24065b378d3363cf4934e4895e61b578 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -5,6 +5,7 @@ use App\Models\Consumable; use Illuminate\Database\Eloquent\Collection; use App\Helpers\Helper; use Gate; +use Illuminate\Support\Facades\Storage; class ConsumablesTransformer { @@ -23,7 +24,7 @@ class ConsumablesTransformer $array = [ 'id' => (int) $consumable->id, 'name' => e($consumable->name), - 'image' => ($consumable->image) ? e(url('/').'/uploads/consumables/'.e($consumable->image)) : null, + 'image' => ($consumable->image) ? Storage::disk('public')->url('consumables/'.e($consumable->image)) : null, 'category' => ($consumable->category) ? ['id' => $consumable->category->id, 'name' => e($consumable->category->name)] : null, 'company' => ($consumable->company) ? ['id' => (int) $consumable->company->id, 'name' => e($consumable->company->name)] : null, 'item_no' => e($consumable->item_no), diff --git a/app/Http/Transformers/DepartmentsTranformer.php b/app/Http/Transformers/DepartmentsTranformer.php index f81954f947545e32d85eb9805dfb525dfff90d5d..a24943b96ed4bc49b9f361f5de84314f5cf15b26 100644 --- a/app/Http/Transformers/DepartmentsTranformer.php +++ b/app/Http/Transformers/DepartmentsTranformer.php @@ -5,6 +5,7 @@ use App\Models\Department; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class DepartmentsTransformer { @@ -25,7 +26,7 @@ class DepartmentsTransformer $array = [ 'id' => (int) $department->id, 'name' => e($department->name), - 'image' => ($department->image) ? app('departments_upload_url').e($department->image) : null, + 'image' => ($department->image) ? Storage::disk('public')->url(app('departments_upload_url').e($department->image)) : null, 'company' => ($department->company) ? [ 'id' => (int) $department->company->id, 'name'=> e($department->company->name) diff --git a/app/Http/Transformers/LocationsTransformer.php b/app/Http/Transformers/LocationsTransformer.php index 5d93db4deff13101ea7f0a1ae19a3adec0e66187..ce018d4f6c1dd25d4bd8ded746bdbfd0e82f3415 100644 --- a/app/Http/Transformers/LocationsTransformer.php +++ b/app/Http/Transformers/LocationsTransformer.php @@ -5,6 +5,7 @@ use App\Models\Location; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class LocationsTransformer { @@ -33,7 +34,7 @@ class LocationsTransformer $array = [ 'id' => (int) $location->id, 'name' => e($location->name), - 'image' => ($location->image) ? app('locations_upload_url').e($location->image) : null, + 'image' => ($location->image) ? Storage::disk('public')->url('locations/'.e($location->image)) : null, 'address' => ($location->address) ? e($location->address) : null, 'address2' => ($location->address2) ? e($location->address2) : null, 'city' => ($location->city) ? e($location->city) : null, diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php index 3db65ee9f00a62b0313f6c2cfdd6a4eb90f62309..5457d1c9474be97dcaf3b9e639fc7c3eb7a0c6f3 100644 --- a/app/Http/Transformers/ManufacturersTransformer.php +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -5,6 +5,7 @@ use App\Models\Manufacturer; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class ManufacturersTransformer { @@ -26,7 +27,7 @@ class ManufacturersTransformer 'id' => (int) $manufacturer->id, 'name' => e($manufacturer->name), 'url' => e($manufacturer->url), - 'image' => ($manufacturer->image) ? app('manufacturers_upload_url').e($manufacturer->image) : null, + 'image' => ($manufacturer->image) ? Storage::disk('public')->url('manufacturers/'.e($manufacturer->image)) : null, 'support_url' => e($manufacturer->support_url), 'support_phone' => e($manufacturer->support_phone), 'support_email' => e($manufacturer->support_email), diff --git a/app/Http/Transformers/SuppliersTransformer.php b/app/Http/Transformers/SuppliersTransformer.php index ea636e4a6c3078c181a24a550422d8a3f16db2a4..a3bb8c6f27d0a571b473e1326dadd51c0b4f7f2b 100644 --- a/app/Http/Transformers/SuppliersTransformer.php +++ b/app/Http/Transformers/SuppliersTransformer.php @@ -5,6 +5,7 @@ use App\Models\Supplier; use Illuminate\Database\Eloquent\Collection; use Gate; use App\Helpers\Helper; +use Illuminate\Support\Facades\Storage; class SuppliersTransformer { @@ -25,7 +26,7 @@ class SuppliersTransformer $array = [ 'id' => (int) $supplier->id, 'name' => e($supplier->name), - 'image' => ($supplier->image) ? app('suppliers_upload_url').e($supplier->image) : null, + 'image' => ($supplier->image) ? Storage::disk('public')->url('suppliers/'.e($supplier->image)) : null, 'url' => e($supplier->url), 'address' => ($supplier->address) ? e($supplier->address) : null, 'address2' => ($supplier->address2) ? e($supplier->address2) : null, diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index 76b50704c6e92a536e9c2f69b5cf73182a02572a..41dee8ef13919df3bf1a260159db811ea9a70e99 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; use App\Notifications\CheckinAccessoryNotification; use App\Notifications\CheckoutAccessoryNotification; +use Illuminate\Support\Facades\Storage; /** * Model for Accessories. @@ -219,7 +220,7 @@ class Accessory extends SnipeModel */ public function getImageUrl() { if ($this->image) { - return url('/').'/uploads/accessories/'.$this->image; + return Storage::disk('public')->url(app('accessories_upload_path').$this->image); } return false; diff --git a/app/Models/Asset.php b/app/Models/Asset.php index c2d48cee2b21ea6437934af0cd7e0ad63ed9385e..e0918d20ada819236d47d719ccbb7724d4c71fe8 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -21,6 +21,7 @@ use Watson\Validating\ValidatingTrait; use DB; use App\Notifications\CheckinAssetNotification; use App\Notifications\CheckoutAssetNotification; +use Illuminate\Support\Facades\Storage; /** * Model for Assets. * @@ -159,7 +160,32 @@ class Asset extends Depreciable 'model' => ['name', 'model_number'], 'model.category' => ['name'], 'model.manufacturer' => ['name'], - ]; + ]; + + + /** + * This handles the custom field validation for assets + * + * @var array + */ + public function save($params = []) + { + $settings = \App\Models\Setting::getSettings(); + + // I don't remember why we have this here? Asset tag would always be required, even if auto increment is on... + $this->rules['asset_tag'] = ($settings->auto_increment_assets == '1') ? 'max:255' : 'required'; + + if($this->model_id != '') { + $model = AssetModel::find($this->model_id); + + if (($model) && ($model->fieldset)) { + $this->rules += $model->fieldset->validation_rules(); + } + } + + return parent::save($params); + } + public function getDisplayNameAttribute() { @@ -486,9 +512,9 @@ class Asset extends Depreciable public function getImageUrl() { if ($this->image && !empty($this->image)) { - return url('/').'/uploads/assets/'.$this->image; + return Storage::disk('public')->url(app('assets_upload_path').e($this->image)); } elseif ($this->model && !empty($this->model->image)) { - return url('/').'/uploads/models/'.$this->model->image; + return Storage::disk('public')->url(app('models_upload_path').e($this->model->image)); } return false; } diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index a570cd8c75e6ccd27f4606b051e52608faded66b..1998b277dec9575e7dc0f08886e112348c1d7904 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -8,6 +8,7 @@ use App\Presenters\Presentable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; +use Illuminate\Support\Facades\Storage; /** * Model for Asset Models. Asset Models contain higher level @@ -175,7 +176,7 @@ class AssetModel extends SnipeModel */ public function getImageUrl() { if ($this->image) { - return url('/').'/uploads/models/'.$this->image; + return Storage::disk('public')->url(app('models_upload_path').$this->image); } return false; } diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index 596106c262347e1e2205199f3c90c7915d188c30..853c5249332855f3e548855d2dd1d90cee8cb496 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -7,6 +7,7 @@ use App\Presenters\Presentable; use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; use App\Notifications\CheckoutConsumableNotification; +use Illuminate\Support\Facades\Storage; class Consumable extends SnipeModel { @@ -203,7 +204,7 @@ class Consumable extends SnipeModel */ public function getImageUrl() { if ($this->image) { - return url('/').'/uploads/consumables/'.$this->image; + return Storage::disk('public')->url(app('consumables_upload_path').$this->image); } return false; diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index 0d4985226339a182e65d2cce180f1bad72c01ea7..cc6c16968f7e2443d3ec5fd810c0276134330ee6 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -6,6 +6,7 @@ use App\Helpers\Helper; use App\Models\Setting; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Storage; /** * Class UserPresenter @@ -320,7 +321,7 @@ class UserPresenter extends Presenter { if ($this->avatar) { - return config('app.url').'/uploads/avatars/'.$this->avatar; + return Storage::disk('public')->url('avatars/'.$this->avatar, $this->avatar); } if ((Setting::getSettings()->load_remote=='1') && ($this->email!='')) { diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index ed965bf9c7ca00a1f9639a7bec9bfdb008d1d4c3..63ed2e68ed6c103a89489017dd14ae0656a4fa05 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -39,76 +39,85 @@ class SettingsServiceProvider extends ServiceProvider * Set some common variables so that they're globally available. * The paths should always be public (versus private uploads) */ + + + // Model paths and URLs + + \App::singleton('assets_upload_path', function(){ + return 'assets/'; + }); + + \App::singleton('models_upload_path', function(){ - return public_path('/uploads/models/'); + return 'assetmodels/'; }); \App::singleton('models_upload_url', function(){ - return url('/').'/uploads/models/'; + return 'assetmodels/'; }); // Categories \App::singleton('categories_upload_path', function(){ - return public_path('/uploads/categories/'); + return 'categories/'; }); \App::singleton('categories_upload_url', function(){ - return url('/').'/uploads/categories/'; + return 'categories/'; }); // Locations \App::singleton('locations_upload_path', function(){ - return public_path('/uploads/locations/'); + return 'locations/'; }); \App::singleton('locations_upload_url', function(){ - return url('/').'/uploads/locations/'; + return 'storage/public_uploads/locations/'; }); // Users \App::singleton('users_upload_path', function(){ - return public_path('/uploads/users/'); + return 'users/'; }); \App::singleton('users_upload_url', function(){ - return url('/').'/uploads/users/'; + return 'public_uploads/users/'; }); // Manufacturers \App::singleton('manufacturers_upload_path', function(){ - return public_path('/uploads/manufacturers/'); + return 'manufacturers/'; }); \App::singleton('manufacturers_upload_url', function(){ - return url('/').'/uploads/manufacturers/'; + return 'public_uploads/manufacturers/'; }); // Suppliers \App::singleton('suppliers_upload_path', function(){ - return public_path('/uploads/suppliers/'); + return 'suppliers/'; }); \App::singleton('suppliers_upload_url', function(){ - return url('/').'/uploads/suppliers/'; + return 'storage/public_uploads/suppliers/'; }); // Departments \App::singleton('departments_upload_path', function(){ - return public_path('/uploads/departments/'); + return 'departments/'; }); \App::singleton('departments_upload_url', function(){ - return url('/').'/uploads/departments/'; + return 'departments/'; }); // Company paths and URLs \App::singleton('companies_upload_path', function(){ - return public_path('/uploads/companies/'); + return 'companies/'; }); \App::singleton('companies_upload_url', function(){ - return url('/').'/uploads/companies/'; + return 'storage/public_uploads/companies/'; }); diff --git a/composer.json b/composer.json index 41e35cdf928eb77622d1668211c3ed55a816b386..d9270407756a5229d2cab0ff8bdd313228714e3c 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "league/csv": "^9.0", "league/flysystem-aws-s3-v3": "~1.0", "league/flysystem-cached-adapter": "~1.0", + "league/flysystem-rackspace": "^1.0", "league/flysystem-sftp": "~1.0", "maknz/slack": "^1.7", "neitanod/forceutf8": "^2.0", diff --git a/composer.lock b/composer.lock index 027871bbde266fccbb2749fd4b747ea740fceccf..d18eed45cdeb5d06a8882dae9092cd39ca218245 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "94a7bad067cd5d3ea24175dce2f318d6", + "content-hash": "1b2d866e20b5d160ea9d055221d1fec4", "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.67.7", + "version": "3.67.22", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "002577f67703af64a1be35d65edd6a74842c1e65" + "reference": "0d05816beeaf187a3897c28aaa68d683974818d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/002577f67703af64a1be35d65edd6a74842c1e65", - "reference": "002577f67703af64a1be35d65edd6a74842c1e65", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0d05816beeaf187a3897c28aaa68d683974818d9", + "reference": "0d05816beeaf187a3897c28aaa68d683974818d9", "shasum": "" }, "require": { @@ -84,7 +84,7 @@ "s3", "sdk" ], - "time": "2018-09-06T22:05:51+00:00" + "time": "2018-09-28T18:46:40+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1108,16 +1108,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "54859fabea8b3beecbb1a282888d5c990036b9e3" + "reference": "0578b32b30b22de3e8664f797cf846fc9246f786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/54859fabea8b3beecbb1a282888d5c990036b9e3", - "reference": "54859fabea8b3beecbb1a282888d5c990036b9e3", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0578b32b30b22de3e8664f797cf846fc9246f786", + "reference": "0578b32b30b22de3e8664f797cf846fc9246f786", "shasum": "" }, "require": { @@ -1161,7 +1161,7 @@ "validation", "validator" ], - "time": "2018-08-16T20:49:45+00:00" + "time": "2018-09-25T20:47:26+00:00" }, { "name": "erusev/parsedown", @@ -1309,6 +1309,99 @@ "homepage": "https://github.com/firebase/php-jwt", "time": "2017-06-27T22:17:23+00:00" }, + { + "name": "guzzle/guzzle", + "version": "v3.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1" + }, + "replace": { + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" + }, + "require-dev": { + "doctrine/cache": "*", + "monolog/monolog": "1.*", + "phpunit/phpunit": "3.7.*", + "psr/log": "1.0.*", + "symfony/class-loader": "*", + "zendframework/zend-cache": "<2.3", + "zendframework/zend-log": "<2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.8-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle": "src/", + "Guzzle\\Tests": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "abandoned": "guzzlehttp/guzzle", + "time": "2014-01-28T22:29:15+00:00" + }, { "name": "guzzlehttp/guzzle", "version": "6.3.3", @@ -1562,32 +1655,32 @@ }, { "name": "jakub-onderka/php-console-color", - "version": "0.1", + "version": "v0.2", "source": { "type": "git", "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.4.0" }, "require-dev": { "jakub-onderka/php-code-style": "1.0", - "jakub-onderka/php-parallel-lint": "0.*", + "jakub-onderka/php-parallel-lint": "1.0", "jakub-onderka/php-var-dump-check": "0.*", - "phpunit/phpunit": "3.7.*", + "phpunit/phpunit": "~4.3", "squizlabs/php_codesniffer": "1.*" }, "type": "library", "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleColor": "src/" + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1597,11 +1690,10 @@ "authors": [ { "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com", - "homepage": "http://www.acci.cz" + "email": "jakub.onderka@gmail.com" } ], - "time": "2014-04-08T15:00:19+00:00" + "time": "2018-09-29T17:23:10+00:00" }, { "name": "jakub-onderka/php-console-highlighter", @@ -1679,16 +1771,16 @@ }, { "name": "laravel/framework", - "version": "v5.7.2", + "version": "v5.7.6", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "86e1f98a6d2aab018e0257a7cb2ef2110d64a873" + "reference": "93e761bb5367166ce98ba908d5eb0edd6be76792" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/86e1f98a6d2aab018e0257a7cb2ef2110d64a873", - "reference": "86e1f98a6d2aab018e0257a7cb2ef2110d64a873", + "url": "https://api.github.com/repos/laravel/framework/zipball/93e761bb5367166ce98ba908d5eb0edd6be76792", + "reference": "93e761bb5367166ce98ba908d5eb0edd6be76792", "shasum": "" }, "require": { @@ -1816,7 +1908,7 @@ "framework", "laravel" ], - "time": "2018-09-06T14:01:05+00:00" + "time": "2018-09-25T14:29:00+00:00" }, { "name": "laravel/passport", @@ -2195,26 +2287,26 @@ }, { "name": "league/flysystem", - "version": "1.0.46", + "version": "1.0.47", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f3e0d925c18b92cf3ce84ea5cc58d62a1762a2b2" + "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f3e0d925c18b92cf3ce84ea5cc58d62a1762a2b2", - "reference": "f3e0d925c18b92cf3ce84ea5cc58d62a1762a2b2", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a11e4a75f256bdacf99d20780ce42d3b8272975c", + "reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c", "shasum": "" }, "require": { + "ext-fileinfo": "*", "php": ">=5.5.9" }, "conflict": { "league/flysystem-sftp": "<1.0.6" }, "require-dev": { - "ext-fileinfo": "*", "phpspec/phpspec": "^3.4", "phpunit/phpunit": "^5.7.10" }, @@ -2275,20 +2367,20 @@ "sftp", "storage" ], - "time": "2018-08-22T07:45:22+00:00" + "time": "2018-09-14T15:30:29+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "1.0.19", + "version": "1.0.20", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "f135691ef6761542af301b7c9880f140fb12dc74" + "reference": "398c56027e49653712a8fba1eb12600d2a83f3b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/f135691ef6761542af301b7c9880f140fb12dc74", - "reference": "f135691ef6761542af301b7c9880f140fb12dc74", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/398c56027e49653712a8fba1eb12600d2a83f3b7", + "reference": "398c56027e49653712a8fba1eb12600d2a83f3b7", "shasum": "" }, "require": { @@ -2322,7 +2414,7 @@ } ], "description": "Flysystem adapter for the AWS S3 SDK v3.x", - "time": "2018-03-27T20:33:59+00:00" + "time": "2018-09-25T12:02:44+00:00" }, { "name": "league/flysystem-cached-adapter", @@ -2371,6 +2463,53 @@ "description": "An adapter decorator to enable meta-data caching.", "time": "2018-07-09T20:51:04+00:00" }, + { + "name": "league/flysystem-rackspace", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-rackspace.git", + "reference": "ba877e837f5dce60e78a0555de37eb9bfc7dd6b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-rackspace/zipball/ba877e837f5dce60e78a0555de37eb9bfc7dd6b9", + "reference": "ba877e837f5dce60e78a0555de37eb9bfc7dd6b9", + "shasum": "" + }, + "require": { + "league/flysystem": "~1.0", + "php": ">=5.4.0", + "rackspace/php-opencloud": "~1.16" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\Rackspace\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Flysystem adapter for Rackspace", + "time": "2016-03-11T12:13:42+00:00" + }, { "name": "league/flysystem-sftp", "version": "1.0.16", @@ -2533,6 +2672,34 @@ "time": "2015-06-03T03:35:16+00:00" }, { + "name": "mikemccabe/json-patch-php", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/mikemccabe/json-patch-php.git", + "reference": "b3af30a6aec7f6467c773cd49b2d974a70f7c0d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikemccabe/json-patch-php/zipball/b3af30a6aec7f6467c773cd49b2d974a70f7c0d4", + "reference": "b3af30a6aec7f6467c773cd49b2d974a70f7c0d4", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "mikemccabe\\JsonPatch\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "description": "Produce and apply json-patch objects", + "time": "2015-01-05T21:19:54+00:00" + }, + { + "name": "monolog/monolog", "version": "1.23.0", "source": { @@ -2701,16 +2868,16 @@ }, { "name": "nesbot/carbon", - "version": "1.33.0", + "version": "1.34.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "55667c1007a99e82030874b1bb14d24d07108413" + "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/55667c1007a99e82030874b1bb14d24d07108413", - "reference": "55667c1007a99e82030874b1bb14d24d07108413", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", + "reference": "1dbd3cb01c5645f3e7deda7aa46ef780d95fcc33", "shasum": "" }, "require": { @@ -2752,20 +2919,20 @@ "datetime", "time" ], - "time": "2018-08-07T08:39:47+00:00" + "time": "2018-09-20T19:36:25+00:00" }, { "name": "nikic/php-parser", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bd088dc940a418f09cda079a9b5c7c478890fb8d" + "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd088dc940a418f09cda079a9b5c7c478890fb8d", - "reference": "bd088dc940a418f09cda079a9b5c7c478890fb8d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fa6ee28600d21d49b2b4e1006b48426cec8e579c", + "reference": "fa6ee28600d21d49b2b4e1006b48426cec8e579c", "shasum": "" }, "require": { @@ -2803,7 +2970,7 @@ "parser", "php" ], - "time": "2018-07-15T17:25:16+00:00" + "time": "2018-09-18T07:03:24+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -3768,6 +3935,63 @@ ], "time": "2018-09-05T11:40:09+00:00" }, + { + "name": "rackspace/php-opencloud", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/rackspace/php-opencloud.git", + "reference": "d6b71feed7f9e7a4b52e0240a79f06473ba69c8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rackspace/php-opencloud/zipball/d6b71feed7f9e7a4b52e0240a79f06473ba69c8c", + "reference": "d6b71feed7f9e7a4b52e0240a79f06473ba69c8c", + "shasum": "" + }, + "require": { + "guzzle/guzzle": "~3.8", + "mikemccabe/json-patch-php": "~0.1", + "php": ">=5.4", + "psr/log": "~1.0" + }, + "require-dev": { + "apigen/apigen": "~4.0", + "fabpot/php-cs-fixer": "1.0.*@dev", + "jakub-onderka/php-parallel-lint": "0.*", + "phpspec/prophecy": "~1.4", + "phpunit/phpunit": "4.3.*", + "satooshi/php-coveralls": "0.6.*@dev" + }, + "type": "library", + "autoload": { + "psr-0": { + "OpenCloud": [ + "lib/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Jamie Hannaford", + "email": "jamie.hannaford@rackspace.com", + "homepage": "https://github.com/jamiehannaford" + } + ], + "description": "PHP SDK for Rackspace/OpenStack APIs", + "keywords": [ + "Openstack", + "nova", + "opencloud", + "rackspace", + "swift" + ], + "time": "2016-01-29T10:34:57+00:00" + }, { "name": "ramsey/uuid", "version": "3.8.0", @@ -4277,16 +4501,16 @@ }, { "name": "spatie/db-dumper", - "version": "2.10.1", + "version": "2.11.1", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "1192bb0df9f49ee1f0bdecb7aa921d2647b4c7c7" + "reference": "858ea38e341e2e5f74a5b59cc8184c5c7e94b50d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/1192bb0df9f49ee1f0bdecb7aa921d2647b4c7c7", - "reference": "1192bb0df9f49ee1f0bdecb7aa921d2647b4c7c7", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/858ea38e341e2e5f74a5b59cc8184c5c7e94b50d", + "reference": "858ea38e341e2e5f74a5b59cc8184c5c7e94b50d", "shasum": "" }, "require": { @@ -4323,7 +4547,7 @@ "mysqldump", "spatie" ], - "time": "2018-08-30T12:10:16+00:00" + "time": "2018-09-27T06:30:34+00:00" }, { "name": "spatie/laravel-backup", @@ -4441,16 +4665,16 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.1.2", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8" + "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7d760881d266d63c5e7a1155cbcf2ac656a31ca8", - "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8ddcb66ac10c392d3beb54829eef8ac1438595f4", + "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4", "shasum": "" }, "require": { @@ -4496,7 +4720,7 @@ "mail", "mailer" ], - "time": "2018-07-13T07:04:35+00:00" + "time": "2018-09-11T07:12:52+00:00" }, { "name": "symfony/console", @@ -6195,22 +6419,23 @@ }, { "name": "codeception/codeception", - "version": "2.4.5", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "5fee32d5c82791548931cbc34806b4de6aa1abfc" + "reference": "dee493561daf644134c95cf176fd2c25aff59ea9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/5fee32d5c82791548931cbc34806b4de6aa1abfc", - "reference": "5fee32d5c82791548931cbc34806b4de6aa1abfc", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/dee493561daf644134c95cf176fd2c25aff59ea9", + "reference": "dee493561daf644134c95cf176fd2c25aff59ea9", "shasum": "" }, "require": { "behat/gherkin": "^4.4.0", "codeception/phpunit-wrapper": "^6.0.9|^7.0.6", "codeception/stub": "^2.0", + "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "facebook/webdriver": ">=1.1.3 <2.0", @@ -6258,7 +6483,7 @@ }, "autoload": { "psr-4": { - "Codeception\\": "src\\Codeception", + "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" } }, @@ -6282,7 +6507,7 @@ "functional testing", "unit testing" ], - "time": "2018-08-01T07:21:49+00:00" + "time": "2018-09-24T09:33:01+00:00" }, { "name": "codeception/phpunit-wrapper", @@ -6419,16 +6644,16 @@ }, { "name": "filp/whoops", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a" + "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/181c4502d8f34db7aed7bfe88d4f87875b8e947a", - "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a", + "url": "https://api.github.com/repos/filp/whoops/zipball/e79cd403fb77fc8963a99ecc30e80ddd885b3311", + "reference": "e79cd403fb77fc8963a99ecc30e80ddd885b3311", "shasum": "" }, "require": { @@ -6447,7 +6672,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.2-dev" } }, "autoload": { @@ -6476,7 +6701,7 @@ "throwable", "whoops" ], - "time": "2018-03-03T17:56:25+00:00" + "time": "2018-06-30T13:14:06+00:00" }, { "name": "fzaninotto/faker", @@ -7127,6 +7352,17 @@ { "name": "roave/security-advisories", "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "8605f2e74f558d3e349b219e58414b75b0adc30e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/8605f2e74f558d3e349b219e58414b75b0adc30e", + "reference": "8605f2e74f558d3e349b219e58414b75b0adc30e", + "shasum": "" + }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", @@ -7134,6 +7370,7 @@ "amphp/http": "<1.0.1", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", + "brightlocal/phpwhois": "<=4.2.5", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.0.15|>=3.1,<3.1.4|>=3.4,<3.4.14|>=3.5,<3.5.17|>=3.6,<3.6.4", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", @@ -7145,6 +7382,7 @@ "contao/core-bundle": ">=4,<4.4.18|>=4.5,<4.5.8", "contao/listing-bundle": ">=4,<4.4.8", "contao/newsletter-bundle": ">=4,<4.1", + "david-garcia/phpwhois": "<=4.3.1", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -7159,6 +7397,7 @@ "drupal/drupal": ">=7,<7.59|>=8,<8.4.8|>=8.5,<8.5.3", "erusev/parsedown": "<1.7", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.3|>=5.4,<5.4.11.3|>=2017.8,<2017.8.1.1|>=2017.12,<2017.12.2.1", + "ezyang/htmlpurifier": "<4.1.1", "firebase/php-jwt": "<2", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", @@ -7170,7 +7409,11 @@ "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", "kreait/firebase-php": ">=3.2,<3.8.1", "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", @@ -7180,6 +7423,7 @@ "monolog/monolog": ">=1.8,<1.12", "namshi/jose": "<2.2", "onelogin/php-saml": "<2.10.4", + "openid/php-openid": "<2.3", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", @@ -7188,21 +7432,25 @@ "paypal/merchant-sdk-php": "<3.12", "phpmailer/phpmailer": ">=5,<5.2.24", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "propel/propel": ">=2.0.0-alpha1,<=2.0.0-alpha7", "propel/propel1": ">=1,<=1.7.1", "pusher/pusher-php-server": "<2.2.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", "shopware/shopware": "<5.3.7", "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", "silverstripe/framework": ">=3,<3.3", "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", "simplesamlphp/simplesamlphp": "<1.15.2", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", "socalnick/scn-social-auth": "<1.15.2", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "stormpath/sdk": ">=0,<9.9.99", @@ -7229,8 +7477,10 @@ "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1,<2.1.2|>=2.1.0-beta1,<2.1.3", + "thelia/thelia": ">=2.1.0-beta1,<2.1.3|>=2.1,<2.1.2", + "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.20", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.30|>=8,<8.7.17|>=9,<9.3.2", "typo3/cms-core": ">=8,<8.7.17|>=9,<9.3.2", @@ -7283,7 +7533,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2018-08-14T15:39:17+00:00" + "time": "2018-09-17T20:20:31+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7610,16 +7860,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "628a481780561150481a9ec74709092b9759b3ec" + "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/628a481780561150481a9ec74709092b9759b3ec", - "reference": "628a481780561150481a9ec74709092b9759b3ec", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6ad28354c04b364c3c71a34e4a18b629cc3b231e", + "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e", "shasum": "" }, "require": { @@ -7657,7 +7907,7 @@ "phpcs", "standards" ], - "time": "2018-07-26T23:47:18+00:00" + "time": "2018-09-23T23:08:17+00:00" }, { "name": "symfony/browser-kit", diff --git a/config/backup.php b/config/backup.php index bc45801f4a480a705d19fb1e218b5a94076be65f..898f467ff2465231a77e4771e29e985072dd48f8 100644 --- a/config/backup.php +++ b/config/backup.php @@ -14,8 +14,7 @@ return [ 'backup' => [ /* - * The name of this application. You can use this name to monitor - * the backups. + * I don't know why they call it name - it's used in the path for uploads */ 'name' => 'backups', @@ -27,8 +26,6 @@ return [ * The list of directories and files that will be included in the backup. */ 'include' => [ - public_path('uploads'), - storage_path('private_uploads'), storage_path('oauth-private.key'), storage_path('oauth-public.key'), (env('BACKUP_ENV')=='true') ? base_path('.env') : base_path('.env.example'), @@ -76,7 +73,7 @@ return [ * The disk names on which the backups will be stored. */ 'disks' => [ - 'local', + env('FILESYSTEM_DISK'), ], ], ], diff --git a/config/filesystems.php b/config/filesystems.php index 6fcf1386b482230bee2f72b0c2ca1e89dace760b..dd64eda5857594a65cc42d999ffe66a816b1db5a 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -1,15 +1,6 @@ <?php -/* - |-------------------------------------------------------------------------- - | DO NOT EDIT THIS FILE DIRECTLY. - |-------------------------------------------------------------------------- - | This file reads from your .env configuration file and should not - | be modified directly. -*/ - - -return [ +$config = [ /* |-------------------------------------------------------------------------- @@ -17,10 +8,8 @@ return [ |-------------------------------------------------------------------------- | | Here you may specify the default filesystem disk that should be used - | by the framework. A "local" driver, as well as a variety of cloud - | based drivers are available for your choosing. Just store away! - | - | Supported: "local", "ftp", "s3", "rackspace" + | by the framework. The "local" disk, as well as a variety of cloud + | based disks are available to your application. Just store away! | */ @@ -37,7 +26,7 @@ return [ | */ - 'cloud' => 's3', + 'cloud' => env('FILESYSTEM_CLOUD', 's3'), /* |-------------------------------------------------------------------------- @@ -48,52 +37,54 @@ return [ | may even configure multiple disks of the same driver. Defaults have | been setup for each driver as an example of the required options. | + | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" + | */ 'disks' => [ 'local' => [ 'driver' => 'local', - 'root' => base_path(), - ], - - 'ftp' => [ - 'driver' => 'ftp', - 'host' => env('FTP_HOST', 'ftp.yourhost.com'), - 'username' => env('FTP_USERNAME', 'ftp-user'), - 'password' => env('FTP_PASSWORD', 'ftp-pass'), - 'port' => env('FTP_PORT', '21'), - 'root' => env('FTP_ROOT', ''), - 'passive' => env('FTP_PASSIVE', true), - 'ssl' => env('FTP_SSL', true), - 'timeout' => env('FTP_TIMEOUT', 30), + 'root' => storage_path('app'), ], - 'sftp' => [ - 'driver' => 'sftp', - 'host' => env('SFTP_HOST', 'sftp.yourhost.com'), - 'username' => env('SFTP_USERNAME', 'sftp-user'), - 'password' => env('SFTP_PASSWORD', 'sftp-pass'), - 'port' => env('SFTP_PORT', '22'), - 'root' => env('SFTP_ROOT', ''), - 'timeout' => env('SFTP_TIMEOUT', 30), + // This applies the LOCAL public only, not S3/FTP/etc + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', - 'key' => env('AWS_KEY', null), - 'secret' => env('AWS_SECRET', null), - 'region' => env('AWS_REGION', null), - 'bucket' => env('AWS_BUCKET', null), - - 'cache' => [ - 'store' => env('AWS_CACHE_STORE', 'memcached'), - 'expire' => env('AWS_CACHE_EXPIRES', 600), - 'prefix' => env('AWS_CACHE_PREFIX', 'cache-prefix'), - ], + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'root' => env('AWS_BUCKET_ROOT'), ], + 'rackspace' => [ + 'driver' => 'rackspace', + 'username' => env('RACKSPACE_USERNAME'), + 'key' => env('RACKSPACE_KEY'), + 'container' => env('RACKSPACE_CONTAINER'), + 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', + 'region' => env('RACKSPACE_REGION'), + 'url_type' => env('RACKSPACE_URL_TYPE'), + ], ], ]; + +// When you're dealing with local file storage, the paths will be different than S3 +if (env('FILESYSTEM_DISK')!='local') +{ + $config['disks']['public'] = $config['disks'][env('FILESYSTEM_DISK')]; + $config['disks']['public']['visibility'] = 'public'; +} + +return $config; diff --git a/database/seeds/AssetModelSeeder.php b/database/seeds/AssetModelSeeder.php index fdb1adef0a46c4b9e4d1a94728fe449089b9baba..03c7fb50955e31ecbe952e46910904faec9adbc6 100755 --- a/database/seeds/AssetModelSeeder.php +++ b/database/seeds/AssetModelSeeder.php @@ -2,6 +2,7 @@ use Illuminate\Database\Seeder; use App\Models\AssetModel; +use Illuminate\Support\Facades\Storage; class AssetModelSeeder extends Seeder { @@ -39,21 +40,30 @@ class AssetModelSeeder extends Seeder factory(AssetModel::class, 1)->states('ultrafine')->create(); // 17 factory(AssetModel::class, 1)->states('ultrasharp')->create(); // 18 - $src = public_path('/img/demo/models'); - $dst = public_path('/uploads/models'); - - $del_files = glob($dst."/*.*"); + $src = public_path('/img/demo/models/'); + $dst = 'assetmodels'.'/'; + $del_files = Storage::files($dst); foreach($del_files as $del_file){ // iterate files - if(is_file($del_file)) - unlink($del_file); // delete file + $file_to_delete = str_replace($src,'',$del_file); + \Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + \Log::debug($e); + } } $add_files = glob($src."/*.*"); foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,$dst,$add_file); - copy($add_file, $file_to_copy); + $file_to_copy = str_replace($src,'',$add_file); + \Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + \Log::debug($e); + } } diff --git a/database/seeds/AssetSeeder.php b/database/seeds/AssetSeeder.php index 79e47d6113f7f55335691766b9990d3f8447af70..f9c2f1fc832915ddecdcf5496d5bf26eba9d5134 100644 --- a/database/seeds/AssetSeeder.php +++ b/database/seeds/AssetSeeder.php @@ -1,7 +1,7 @@ <?php use Illuminate\Database\Seeder; use App\Models\Asset; - +use Illuminate\Support\Facades\Storage; class AssetSeeder extends Seeder { @@ -35,13 +35,14 @@ class AssetSeeder extends Seeder factory(Asset::class, 10)->states('ultrasharp')->create(); - $dst = public_path('/uploads/assets'); - - $del_files = glob($dst."/*.*"); - + $del_files = Storage::files('companies'); foreach($del_files as $del_file){ // iterate files - if(is_file($del_file)) - unlink($del_file); // delete file + \Log::debug('Deleting: '.$del_files); + try { + Storage::disk('public')->delete('assets'.'/'.$del_files); + } catch (\Exception $e) { + \Log::debug($e); + } } DB::table('checkout_requests')->truncate(); diff --git a/database/seeds/CompanySeeder.php b/database/seeds/CompanySeeder.php index 3885b939f46fb5fe7513e53cf2b854cfdd9939b8..eeae5492b76bdbcb3bb9d40949e433d3915adb23 100644 --- a/database/seeds/CompanySeeder.php +++ b/database/seeds/CompanySeeder.php @@ -12,26 +12,37 @@ class CompanySeeder extends Seeder */ public function run() { - // + \Log::debug('Seed companies'); Company::truncate(); factory(Company::class, 4)->create(); - $src = public_path('/img/demo/companies'); - $dst = public_path('/uploads/companies'); - $del_files = glob($dst."/*.*"); + $src = public_path('/img/demo/companies/'); + $dst = 'companies'.'/'; + $del_files = Storage::files('companies/'.$dst); foreach($del_files as $del_file){ // iterate files - if(is_file($del_file)) - unlink($del_file); // delete file + $file_to_delete = str_replace($src,'',$del_file); + \Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + \Log::debug($e); + } } $add_files = glob($src."/*.*"); foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,$dst,$add_file); - copy($add_file, $file_to_copy); + $file_to_copy = str_replace($src,'',$add_file); + \Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + \Log::debug($e); + } } + } } diff --git a/database/seeds/LocationSeeder.php b/database/seeds/LocationSeeder.php index 40d389792f86f84cc216ee286d5926553f3cd045..f7d857f34d2d9da47f0885de621ac322700c2e16 100644 --- a/database/seeds/LocationSeeder.php +++ b/database/seeds/LocationSeeder.php @@ -1,7 +1,7 @@ <?php use Illuminate\Database\Seeder; use App\Models\Location; - +use Illuminate\Support\Facades\Storage; class LocationSeeder extends Seeder { @@ -10,21 +10,30 @@ class LocationSeeder extends Seeder Location::truncate(); factory(Location::class, 10)->create(); - $src = public_path('/img/demo/locations'); - $dst = public_path('/uploads/locations'); - - $del_files = glob($dst."/*.*"); + $src = public_path('/img/demo/locations/'); + $dst = 'locations'.'/'; + $del_files = Storage::files($dst); foreach($del_files as $del_file){ // iterate files - if(is_file($del_file)) - unlink($del_file); // delete file + $file_to_delete = str_replace($src,'',$del_file); + \Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + \Log::debug($e); + } } $add_files = glob($src."/*.*"); foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,$dst,$add_file); - copy($add_file, $file_to_copy); + $file_to_copy = str_replace($src,'',$add_file); + \Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + \Log::debug($e); + } } } diff --git a/database/seeds/ManufacturerSeeder.php b/database/seeds/ManufacturerSeeder.php index f6d9a2451e8025d2aa129113e3554ffdc39063eb..a65d12a2e4ff50c703199f3e8ab884d778773eaf 100644 --- a/database/seeds/ManufacturerSeeder.php +++ b/database/seeds/ManufacturerSeeder.php @@ -1,6 +1,7 @@ <?php use Illuminate\Database\Seeder; use App\Models\Manufacturer; +use Illuminate\Support\Facades\Storage; class ManufacturerSeeder extends Seeder { @@ -19,21 +20,30 @@ class ManufacturerSeeder extends Seeder factory(Manufacturer::class, 1)->states('avery')->create(); // 10 factory(Manufacturer::class, 1)->states('crucial')->create(); // 10 - $src = public_path('/img/demo/manufacturers'); - $dst = public_path('/uploads/manufacturers'); - - $del_files = glob($dst."/*.*"); + $src = public_path('/img/demo/manufacturers/'); + $dst = 'manufacturers'.'/'; + $del_files = Storage::files($dst); foreach($del_files as $del_file){ // iterate files - if(is_file($del_file)) - unlink($del_file); // delete file + $file_to_delete = str_replace($src,'',$del_file); + \Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + \Log::debug($e); + } } $add_files = glob($src."/*.*"); foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,$dst,$add_file); - copy($add_file, $file_to_copy); + $file_to_copy = str_replace($src,'',$add_file); + \Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + \Log::debug($e); + } } diff --git a/public/img/demo/logo.png b/public/img/demo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..423a5b74906c4a1f67dab665a59a6731f0dbaa98 Binary files /dev/null and b/public/img/demo/logo.png differ diff --git a/resources/lang/en/general.php b/resources/lang/en/general.php index ea339cf9a7404f177140b1490f6c157efc7438b5..69690be019e1ef14f08249121398308371517678 100644 --- a/resources/lang/en/general.php +++ b/resources/lang/en/general.php @@ -125,6 +125,7 @@ 'feature_disabled' => 'This feature has been disabled for the demo installation.', 'location' => 'Location', 'locations' => 'Locations', + 'logo_size' => 'Square logos look best with Logo + Text. Logo maximum display size is 50px high x 500px wide. ', 'logout' => 'Logout', 'lookup_by_tag' => 'Lookup by Asset Tag', 'maintenances' => 'Maintenances', diff --git a/resources/views/accessories/edit.blade.php b/resources/views/accessories/edit.blade.php index 6b2065a089eb89529df2888d5c00bb71c6696c25..9148c8b139d58603f495750fa41b6efa5ade9e92 100755 --- a/resources/views/accessories/edit.blade.php +++ b/resources/views/accessories/edit.blade.php @@ -29,7 +29,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/accessories/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('accessories_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/account/profile.blade.php b/resources/views/account/profile.blade.php index 18a828703552a5cadc8ac638ddf2bffdc9df932c..bbff2a602f9b8dac90edbae7aefcb214cb195a79 100755 --- a/resources/views/account/profile.blade.php +++ b/resources/views/account/profile.blade.php @@ -90,7 +90,7 @@ <label class="col-md-3 control-label" for="avatar_delete">{{ trans('general.avatar_delete') }}</label> <div class="col-md-8"> {{ Form::checkbox('avatar_delete') }} - <img src="{{ url('/') }}/uploads/avatars/{{ $user->avatar }}" class="avatar img-circle"> + <img src="{{ $user->present()->gravatar}}" class="avatar img-circle"> {!! $errors->first('avatar_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php index 88bc6457be8fa5026746454ed52f1711f77ac232..ca43c49bb8707d51b43f4301fe984a60b4e24ae1 100755 --- a/resources/views/categories/edit.blade.php +++ b/resources/views/categories/edit.blade.php @@ -79,7 +79,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-9"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/categories/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('categories_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/companies/edit.blade.php b/resources/views/companies/edit.blade.php index 8f63b05c4fa0502045ba3400592f678b84137aac..ee77efc4f5bd678b456ec8c6de571b26a9a2ef6d 100644 --- a/resources/views/companies/edit.blade.php +++ b/resources/views/companies/edit.blade.php @@ -16,7 +16,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/companies/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('companies_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/components/edit.blade.php b/resources/views/components/edit.blade.php index 8e9be373810af6975e6ff11c45aebf1e02567453..9bfdf6a4330d6f5728f2068b465af9a2472a6598 100644 --- a/resources/views/components/edit.blade.php +++ b/resources/views/components/edit.blade.php @@ -27,7 +27,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/components/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('components_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/consumables/edit.blade.php b/resources/views/consumables/edit.blade.php index 9496019e419acba01e880ed2ea5a6c32e8d216d9..4392c1f1b420550d975727ddf26f960cf5398fa5 100644 --- a/resources/views/consumables/edit.blade.php +++ b/resources/views/consumables/edit.blade.php @@ -27,7 +27,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/consumables/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('consumables_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/departments/edit.blade.php b/resources/views/departments/edit.blade.php index ff5bbfd16f79a3f589afd369f0706a2ec79e35a5..4d3952528e45b64e61c2b131757a7f8901fd1dfb 100644 --- a/resources/views/departments/edit.blade.php +++ b/resources/views/departments/edit.blade.php @@ -29,7 +29,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/departments/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('departments_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php index c3c5d9be2ac3fb0bf053dfc6244c3564b1bdeb41..708d296eaf5159048d43bb991446b03737c9fa12 100755 --- a/resources/views/hardware/edit.blade.php +++ b/resources/views/hardware/edit.blade.php @@ -86,7 +86,7 @@ {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </label> <div style="margin-top: 0.5em"> - <img src="{{ url('/') }}/uploads/assets/{{ $item->image }}" class="img-responsive"/> + <img src="{{ Storage::disk('public')->url(app('assets_upload_path').e($item->image)) }}" class="img-responsive" /> </div> </div> </div> @@ -170,7 +170,7 @@ }); } } - ; + $(function () { //grab custom fields for this model whenever model changes. @@ -184,135 +184,8 @@ user_add($(".status_id").val()); }); - $("#create-form").submit(function (event) { - event.preventDefault(); - return sendForm(); - }); - - // Resize Files when chosen - //First check to see if there is a file before doing anything else - - var imageData = ""; - var $fileInput = $('#uploadFile'); - $fileInput.on('change', function (e) { - if ($fileInput != '') { - if (window.File && window.FileReader && window.FormData) { - var file = e.target.files[0]; - if (file) { - if (/^image\//i.test(file.type)) { - readFile(file); - } else { - alert('Invalid Image File :('); - } - } - } - else { - console.log("File API not supported, not resizing"); - } - } - }); - - - function readFile(file) { - var reader = new FileReader(); - - reader.onloadend = function () { - processFile(reader.result, file.type); - } - - reader.onerror = function () { - alert("Unable to read file"); - } - - reader.readAsDataURL(file); - } - - function processFile(dataURL, fileType) { - var maxWidth = 800; - var maxHeight = 800; - - var image = new Image(); - image.src = dataURL; - - image.onload = function () { - var width = image.width; - var height = image.height; - var shouldResize = (width > maxWidth) || (height > maxHeight); - - if (!shouldResize) { - imageData = dataURL; - return; - } - - var newWidth; - var newHeight; - - if (width > height) { - newHeight = height * (maxWidth / width); - newWidth = maxWidth; - } else { - newWidth = width * (maxHeight / height); - newHeight = maxHeight; - } - var canvas = document.createElement('canvas'); - - canvas.width = newWidth; - canvas.height = newHeight; - - var context = canvas.getContext('2d'); - - context.drawImage(this, 0, 0, newWidth, newHeight); - - dataURL = canvas.toDataURL(fileType); - - imageData = dataURL; - - }; - - image.onerror = function () { - alert('Unable to process file :('); - } - } - - function sendForm() { - var form = $("#create-form").get(0); - var formData = $('#create-form').serializeArray(); - formData.push({name: 'image', value: imageData}); - $.ajax({ - type: 'POST', - url: form.action, - headers: { - "X-Requested-With": 'XMLHttpRequest', - "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') - }, - data: formData, - dataType: 'json', - success: function (data) { - // console.dir(data); - // AssetController flashes success to session, redirect to hardware page. - if (data.redirect_url) { - window.location.href = data.redirect_url; - return true; - } - window.location.reload(true); - return false; - - }, - error: function (data) { - // AssetRequest Validator will flash all errors to session, this just refreshes to see them. - window.location.reload(true); - // console.log(JSON.stringify(data)); - // console.log('error submitting'); - } - }); - - return false; - } - }); - - </script> @stop diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php index dd8ea1b6e30f96a61fbc555851af9487c7f2ce86..f6b5ffc69e10fe34ee12881687e37b304089d13a 100755 --- a/resources/views/hardware/view.blade.php +++ b/resources/views/hardware/view.blade.php @@ -497,9 +497,9 @@ <div class="col-md-4"> @if ($asset->image) - <img src="{{ url('/') }}/uploads/assets/{{{ $asset->image }}}" class="assetimg img-responsive"> + <img src="{{ Storage::disk('public')->url(app('assets_upload_path').e($asset->image)) }}" class="assetimg img-responsive"> @elseif (($asset->model) && ($asset->model->image!='')) - <img src="{{ url('/') }}/uploads/models/{{{ $asset->model->image }}}" class="assetimg img-responsive"> + <img src="{{ Storage::disk('public')->url(app('models_upload_url').e($asset->model->image )) }}" class="assetimg img-responsive"> @endif @if ($snipeSettings->qr_code=='1') diff --git a/resources/views/layouts/basic.blade.php b/resources/views/layouts/basic.blade.php index 1e9b3334b5c77d760223a2d03ae58b8cbf1cccfa..4942c240414fe74105da09c819b7e2adceb6ad61 100644 --- a/resources/views/layouts/basic.blade.php +++ b/resources/views/layouts/basic.blade.php @@ -45,7 +45,7 @@ @if (($snipeSettings) && ($snipeSettings->logo!='')) <center> - <img id="login-logo" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}"> + <img id="login-logo" src="{{ Storage::disk('public')->url('').e($snipeSettings->logo) }}"> </center> @endif <!-- Content --> diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index f74fc9ce670d33ad4ee96e410bb0440f856cc7c0..ca06e2e6f0c50a2b09d89bcc3ec0e9cba8d1e1d6 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -96,14 +96,14 @@ @if ($snipeSettings->brand == '3') <a class="logo navbar-brand no-hover" href="{{ url('/') }}"> @if ($snipeSettings->logo!='') - <img class="navbar-brand-img" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}"> + <img class="navbar-brand-img" src="{{ Storage::disk('public')->url('').e($snipeSettings->logo) }}"> @endif {{ $snipeSettings->site_name }} </a> @elseif ($snipeSettings->brand == '2') <a class="logo navbar-brand no-hover" href="{{ url('/') }}"> @if ($snipeSettings->logo!='') - <img class="navbar-brand-img" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}"> + <img class="navbar-brand-img" src="{{ Storage::disk('public')->url('').e($snipeSettings->logo) }}"> @endif </a> @else diff --git a/resources/views/locations/edit.blade.php b/resources/views/locations/edit.blade.php index 253a069ce01ac5a350ba8538be9a1b60f774a1c2..3990c5b8fb37b0be13f9571c4dae0d93f1cb3516 100755 --- a/resources/views/locations/edit.blade.php +++ b/resources/views/locations/edit.blade.php @@ -54,9 +54,9 @@ @if ($item->image) <div class="form-group {{ $errors->has('image_delete') ? 'has-error' : '' }}"> <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> - <div class="col-md-5"> + <div class="col-md-9"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/locations/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('locations_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/manufacturers/edit.blade.php b/resources/views/manufacturers/edit.blade.php index af212be8fcb1bacd9b2bcb30c3c97f80faeadf3d..eb8fa88b41098979e79777f2f0499daab0432cd9 100755 --- a/resources/views/manufacturers/edit.blade.php +++ b/resources/views/manufacturers/edit.blade.php @@ -56,7 +56,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/manufacturers/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('manufacturers_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg">:message</span>') !!} </div> </div> diff --git a/resources/views/models/edit.blade.php b/resources/views/models/edit.blade.php index ae271c58353e6d8c56f2eda8a59baeffc7607c03..ccf8728c8bd35231bacb0bbf2a8ced204fbc7755 100755 --- a/resources/views/models/edit.blade.php +++ b/resources/views/models/edit.blade.php @@ -62,7 +62,7 @@ <label class="col-md-3 control-label" for="image_delete">{{ trans('general.image_delete') }}</label> <div class="col-md-5"> {{ Form::checkbox('image_delete') }} - <img src="{{ url('/') }}/uploads/models/{{ $item->image }}" /> + <img src="{{ Storage::disk('public')->url(app('models_upload_path').e($item->image)) }}" class="img-responsive" /> {!! $errors->first('image_delete', '<span class="alert-msg"><br>:message</span>') !!} </div> </div> diff --git a/resources/views/partials/forms/edit/image-upload.blade.php b/resources/views/partials/forms/edit/image-upload.blade.php index 32b1b3ce5b8f77365e107becfe4a074cfce76818..b0c7819b6e28a197d59777bc47780f0ed316dfbe 100644 --- a/resources/views/partials/forms/edit/image-upload.blade.php +++ b/resources/views/partials/forms/edit/image-upload.blade.php @@ -3,14 +3,14 @@ <div class="col-md-9"> <label class="btn btn-default"> {{ trans('button.select_file') }} - <input type="file" name="image" id="uploadFile" data-maxsize="{{ \App\Helpers\Helper::file_upload_max_size() }}" accept="image/gif,image/jpeg,image/png,image/svg" style="display:none"> + <input type="file" name="image" id="uploadFile" data-maxsize="{{ \App\Helpers\Helper::file_upload_max_size() }}" accept="image/gif,image/jpeg,image/png,image/svg" style="display:none; max-width: 90%"> </label> <span class='label label-default' id="upload-file-info"></span> <p class="help-block" id="upload-file-status">{{ trans('general.image_filetypes_help', ['size' => \App\Helpers\Helper::file_upload_max_size_readable()]) }}</p> {!! $errors->first('image', '<span class="alert-msg">:message</span>') !!} </div> - <div class="col-md-4"> + <div class="col-md-9 col-md-offset-3"> <img id="imagePreview" style="max-width: 200px;"> </div> </div> diff --git a/resources/views/settings/backups.blade.php b/resources/views/settings/backups.blade.php index 534a2910058b8b8e5c024a82047cf25d5f48639d..148c81967b02440f92aac6c6cec9575e9d78c790 100644 --- a/resources/views/settings/backups.blade.php +++ b/resources/views/settings/backups.blade.php @@ -29,7 +29,7 @@ <tbody> @foreach ($files as $file) <tr> - <td><a href="backups/download/{{ $file['filename'] }}">{{ $file['filename'] }}</a></td> + <td><a href="{{ Storage::url('backups/'.e($file['filename'])) }}">{{ $file['filename'] }}</a></td> <td>{{ date("M d, Y g:i A", $file['modified']) }} </td> <td>{{ $file['filesize'] }}</td> <td> diff --git a/resources/views/settings/branding.blade.php b/resources/views/settings/branding.blade.php index 67565704619732b75c865e9fd7465f472f47a8b4..4a7170459a60768533aa302568f51c64b9fea5bb 100644 --- a/resources/views/settings/branding.blade.php +++ b/resources/views/settings/branding.blade.php @@ -37,7 +37,7 @@ <div class="box-body"> - <div class="col-md-11 col-md-offset-1"> + <div class="col-md-12"> <!-- Site name --> <div class="form-group {{ $errors->has('site_name') ? 'error' : '' }}"> @@ -60,23 +60,31 @@ <!-- Logo --> <div class="form-group {{ $errors->has('image') ? 'has-error' : '' }}"> - <label class="col-md-3 control-label" for="image"> - {{ Form::label('logo', trans('admin/settings/general.logo')) }}</label> + <label class="col-md-3" for="image"> + {{ Form::label('image', trans('admin/settings/general.logo')) }}</label> + <div class="col-md-9"> - @if (config('app.lock_passwords')) - <p class="help-block">{{ trans('general.lock_passwords') }}</p> - @else <label class="btn btn-default"> {{ trans('button.select_file') }} - <input type="file" name="image" accept="image/gif,image/jpeg,image/png,image/svg" hidden> + <input type="file" name="image" id="uploadFile" data-maxsize="{{ \App\Helpers\Helper::file_upload_max_size() }}" accept="image/gif,image/jpeg,image/png,image/svg" style="display:none; max-width: 90%"> </label> + <span class='label label-default' id="upload-file-info"></span> - <p class="help-block" id="upload-file-status">{{ trans('general.image_filetypes_help', ['size' => \App\Helpers\Helper::file_upload_max_size_readable()]) }}</p> - + <p class="help-block" id="upload-file-status">{{ trans('general.image_filetypes_help', ['size' => \App\Helpers\Helper::file_upload_max_size_readable()]) }} {{ trans('general.logo_size') }}</p> {!! $errors->first('image', '<span class="alert-msg">:message</span>') !!} - {{ Form::checkbox('clear_logo', '1', Input::old('clear_logo'),array('class' => 'minimal')) }} Remove - @endif + + </div> + <div class="col-md-9 col-md-offset-3"> + <img id="imagePreview" style="max-width: 500px; max-height: 50px"> </div> + + @if ($setting->logo!='') + <div class="col-md-9 col-md-offset-3"> + + {{ Form::checkbox('clear_logo', '1', Input::old('clear_logo'),array('class' => 'minimal')) }} Remove current image + + </div> + @endif </div> @@ -157,7 +165,7 @@ {{ Form::textarea('custom_css', Input::old('custom_css', $setting->custom_css), array('class' => 'form-control','placeholder' => 'Add your custom CSS')) }} {!! $errors->first('custom_css', '<span class="alert-msg">:message</span>') !!} @endif - <p class="help-block">{{ trans('admin/settings/general.custom_css_help') }}</p> + <p class="help-block">{!! trans('admin/settings/general.custom_css_help') !!}</p> </div> </div> diff --git a/resources/views/users/view.blade.php b/resources/views/users/view.blade.php index 20b9b7fd4dd1d491d8c5721aea4c84fdd91f599f..09a572c0553a2357ce28024bb532a7015d0a9066 100755 --- a/resources/views/users/view.blade.php +++ b/resources/views/users/view.blade.php @@ -115,11 +115,7 @@ </div> @endif <div class="col-md-2 text-center"> - @if ($user->avatar) - <img src="/uploads/avatars/{{ $user->avatar }}" class="avatar img-thumbnail hidden-print"> - @else - <img src="{{ $user->present()->gravatar() }}" class="avatar img-circle hidden-print"> - @endif + <img src="{{ $user->present()->gravatar }}" class="avatar img-thumbnail hidden-print"> </div> <div class="col-md-8"> diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php index 686ee632f5545a3f07aa27267c4ad6053782a422..fe93f44a995f67f8ff3bac290e957304f81ffe4b 100644 --- a/resources/views/vendor/mail/html/header.blade.php +++ b/resources/views/vendor/mail/html/header.blade.php @@ -4,13 +4,13 @@ @if ($snipeSettings->brand == '3') @if ($snipeSettings->logo!='') - <img class="navbar-brand-img logo" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}"alt="{{ $snipeSettings->site_name }}"> + <img class="navbar-brand-img logo" src="{{ Storage::disk('public')->url('').e($snipeSettings->logo) }}"alt="{{ $snipeSettings->site_name }}"> @endif {{ $snipeSettings->site_name }} @elseif ($snipeSettings->brand == '2') @if ($snipeSettings->logo!='') - <img class="navbar-brand-img logo" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}" alt="{{ $snipeSettings->site_name }}"> + <img class="navbar-brand-img logo" src="{{ Storage::disk('public')->url('').e($snipeSettings->logo) }}" alt="{{ $snipeSettings->site_name }}"> @endif @else {{ $snipeSettings->site_name }} diff --git a/upgrade.php b/upgrade.php index 030d262072010508df4188b64568db1151072229..08eafd6b264b92e84934414fbe010311031d1311 100644 --- a/upgrade.php +++ b/upgrade.php @@ -174,16 +174,71 @@ echo "\n"; echo "--------------------------------------------------------\n"; -echo "Step 9: Taking application out of maintenance mode:\n"; +echo "Step 10: Taking application out of maintenance mode:\n"; echo "--------------------------------------------------------\n\n"; $up = shell_exec('php artisan up'); echo '-- '.$up."\n\n"; + +echo "--------------------------------------------------------\n"; +echo "Step 11: Checking for v5 public storage directories: \n"; +echo "--------------------------------------------------------\n\n"; + + +if ((!file_exists('storage/app/public')) && (!is_dir('storage/app/public'))) { + echo "- No public directory found in storage/app - creating one.\n\n"; + if (!mkdir('storage/app/public', 0777, true)) { + echo "ERROR: Failed to create directory at storage/app/public. You should do this manually.\n\n"; + } + $storage_simlink = shell_exec('php artisan storage:link'); + echo $storage_simlink; + +} else { + echo "- Public storage directory already exists. Skipping...\n\n"; +} + +echo "- Copying files into storage/app/public.\n\n"; +if (rmove('public/uploads','storage/app/public')) { + echo "- Copy successful.\n\n"; +} else { + echo "- Copy failed - you should do this manually by copying the files from public/uploads into the storage/app/public directory.\n\n"; +} + echo "--------------------------------------------------------\n"; echo "FINISHED! Clear your browser cookies and re-login to use :\n"; echo "your upgraded Snipe-IT.\n"; echo "--------------------------------------------------------\n\n"; - +/** + * Recursively move files from one directory to another + * + * @param String $src - Source of files being moved + * @param String $dest - Destination of files being moved + */ +function rmove($src, $dest){ + + // If source is not a directory stop processing + if(!is_dir($src)) return false; + + // If the destination directory does not exist create it + if(!is_dir($dest)) { + if(!mkdir($dest)) { + // If the destination directory could not be created stop processing + return false; + } + } + + // Open the source directory to read in files + $i = new DirectoryIterator($src); + foreach($i as $f) { + if($f->isFile()) { + rename($f->getRealPath(), "$dest/" . $f->getFilename()); + } else if(!$f->isDot() && $f->isDir()) { + rmove($f->getRealPath(), "$dest/$f"); + unlink($f->getRealPath()); + } + } + unlink($src); +}