shell bypass 403
<?php namespace App\Http\Controllers\Admin; use App\Exceptions\GeneralException; use App\Http\Requests\Settings\StoreLanguageRequest; use App\Http\Requests\Settings\UploadLanguageRequest; use App\Models\Language; use App\Models\User; use App\Repositories\Contracts\LanguageRepository; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Yaml; class LanguageController extends AdminBaseController { protected LanguageRepository $languages; /** * CurrencyController constructor. * * @param LanguageRepository $languages */ public function __construct(LanguageRepository $languages) { $this->languages = $languages; } /** * view all active languages * * @return Application|Factory|View * @throws AuthorizationException */ public function index(): Factory|View|Application { $this->authorize('view languages'); $breadcrumbs = [ ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')], ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Settings')], ['name' => __('locale.menu.Language')], ]; $languages = Language::cursor(); return \view('admin.settings.Language.index', compact('languages', 'breadcrumbs')); } /** * add new language * * @return Application|Factory|View * @throws AuthorizationException */ public function create(): Factory|View|Application { $this->authorize('new languages'); $breadcrumbs = [ ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')], ['link' => url(config('app.admin_path')."/languages"), 'name' => __('locale.menu.Language')], ['name' => __('locale.settings.add_new')], ]; return \view('admin.settings.Language.new', compact('breadcrumbs')); } /** * store new language * * @param StoreLanguageRequest $request * * @return RedirectResponse */ public function store(StoreLanguageRequest $request): RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.languages.index')->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->languages->store($request->input()); return redirect()->route('admin.languages.index')->with([ 'status' => 'success', 'message' => __('locale.settings.successfully_added'), ]); } /** * * change status * * @param Language $language * * @return JsonResponse * @throws AuthorizationException * @throws GeneralException */ public function activeToggle(Language $language): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } try { $this->authorize('manage languages'); if ($language->update(['status' => ! $language->status])) { User::where('locale', $language->code)->update([ 'locale' => 'en', ]); return response()->json([ 'status' => 'success', 'message' => __('locale.settings.status_successfully_change'), ]); } throw new GeneralException(__('locale.exceptions.something_went_wrong')); } catch (ModelNotFoundException $exception) { return response()->json([ 'status' => 'error', 'message' => $exception->getMessage(), ]); } } /** * @param Language $language * * @return RedirectResponse|BinaryFileResponse * @throws AuthorizationException */ public function download(Language $language): BinaryFileResponse|RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.languages.index')->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->authorize('manage languages'); $zip = $this->languages->download($language); return response()->download($zip)->deleteFileAfterSend(); } /** * @param Language $language * * @return Application|Factory|View * @throws AuthorizationException */ public function upload(Language $language): Factory|View|Application { $this->authorize('manage languages'); $breadcrumbs = [ ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')], ['link' => url(config('app.admin_path')."/languages"), 'name' => __('locale.menu.Language')], ['name' => __('locale.settings.upload_language')], ]; return \view('admin.settings.Language.upload', compact('breadcrumbs', 'language')); } /** * upload language files * * @param UploadLanguageRequest $request * @param Language $language * * @return RedirectResponse */ public function uploadLanguage(UploadLanguageRequest $request, Language $language): RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.languages.index')->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->languages->upload($request->all(), $language); return redirect()->route('admin.languages.index')->with([ 'status' => 'success', 'message' => __('locale.settings.upload'), ]); } /** * view language data * * @param Language $language * * @return Application|Factory|\Illuminate\Contracts\View\View * @throws AuthorizationException * @throws FileNotFoundException */ public function show(Language $language): \Illuminate\Contracts\View\View|Factory|Application { $this->authorize('manage languages'); $breadcrumbs = [ ['link' => url(config('app.admin_path')."/dashboard"), 'name' => __('locale.menu.Dashboard')], ['link' => url(config('app.admin_path')."/languages"), 'name' => __('locale.menu.Language')], ['name' => $language->name], ]; $content = Yaml::dump($language->getLocaleArrayFromFile()); return \view('admin.settings.Language.show', compact('breadcrumbs', 'language', 'content')); } /** * delete language * * @param Language $language * * @return JsonResponse * @throws AuthorizationException */ public function destroy(Language $language): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->authorize('delete languages'); $this->languages->destroy($language); return response()->json([ 'status' => 'success', 'message' => __('locale.settings.successfully_deleted'), ]); } /** * translate language file post * * @param Language $language * @param Request $request * * @return RedirectResponse */ public function update(Language $language, Request $request): RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.languages.index')->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } try { $callback = $language->updateFromYaml($request->all()[$language->code]); if (is_numeric($callback)) { return redirect()->route('admin.languages.index')->with([ 'status' => 'success', 'message' => 'Translate file was successfully updated', ]); } return redirect()->route('admin.languages.index')->with([ 'status' => 'error', 'message' => __('locale.exceptions.something_went_wrong'), ]); } catch (ParseException $e) { return redirect()->route('admin.languages.show', $language->uid)->with([ 'status' => 'error', 'message' => $e->getMessage(), ]); } } }