shell bypass 403
<?php namespace App\Http\Controllers\Customer; use App\Http\Requests\Keywords\CustomerUpdate; use App\Http\Requests\Keywords\StoreKeywordsRequest; use App\Http\Requests\SenderID\PayPaymentRequest; use App\Library\Tool; use App\Models\Keywords; use App\Models\PaymentMethods; use App\Models\PhoneNumbers; use App\Models\Senderid; use App\Repositories\Contracts\KeywordRepository; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\View\View; use JetBrains\PhpStorm\NoReturn; class KeywordController extends CustomerBaseController { protected $keywords; /** * KeywordController constructor. * * @param KeywordRepository $keywords */ public function __construct(KeywordRepository $keywords) { $this->keywords = $keywords; } /** * @return Application|Factory|View * @throws AuthorizationException */ public function index() { $this->authorize('view_keywords'); $breadcrumbs = [ ['link' => url('dashboard'), 'name' => __('locale.menu.Dashboard')], ['link' => url('dashboard'), 'name' => __('locale.menu.Sending')], ['name' => __('locale.menu.Keywords')], ]; return view('customer.keywords.index', compact('breadcrumbs')); } /** * @param Request $request * * @return void * @throws AuthorizationException */ #[NoReturn] public function search(Request $request) { $this->authorize('view_keywords'); $columns = [ 0 => 'responsive_id', 1 => 'uid', 2 => 'uid', 3 => 'title', 4 => 'keyword_name', 5 => 'price', 6 => 'status', 7 => 'actions', ]; $totalData = Keywords::where('user_id', Auth::user()->id)->count(); $totalFiltered = $totalData; $limit = $request->input('length'); $start = $request->input('start'); $order = $columns[$request->input('order.0.column')]; $dir = $request->input('order.0.dir'); if (empty($request->input('search.value'))) { $keywords = Keywords::where('user_id', Auth::user()->id)->offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); } else { $search = $request->input('search.value'); $keywords = Keywords::where('user_id', Auth::user()->id)->whereLike(['uid', 'title', 'keyword_name', 'price'], $search) ->offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); $totalFiltered = Keywords::where('user_id', Auth::user()->id)->whereLike(['uid', 'title', 'keyword_name', 'price'], $search)->count(); } $data = []; if ( ! empty($keywords)) { foreach ($keywords as $keyword) { $is_assigned = false; if ($keyword->status == 'assigned') { $is_assigned = true; $status = '<span class="badge bg-success text-uppercase">'.__('locale.labels.assigned').'</span>'; } elseif ($keyword->status == 'available') { $is_assigned = true; $status = '<span class="badge bg-warning text-uppercase">'.__('locale.labels.pending').'</span>'; } else { $status = '<span class="badge bg-danger text-uppercase">'.__('locale.labels.expired').'</span>'; } $reply_mms = false; if ($keyword->reply_mms) { $reply_mms = true; } $nestedData['responsive_id'] = ''; $nestedData['uid'] = $keyword->uid; $nestedData['title'] = $keyword->title; $nestedData['keyword_name'] = $keyword->keyword_name; $nestedData['price'] = "<div> <p class='text-bold-600'>".Tool::format_price($keyword->price, $keyword->currency->format)." </p> <p class='text-muted'>".$keyword->displayFrequencyTime()."</p> </div>"; $nestedData['status'] = $status; $nestedData['is_assigned'] = $is_assigned; $nestedData['reply_mms'] = $reply_mms; $nestedData['remove_mms'] = __('locale.buttons.remove_mms'); $nestedData['show_label'] = __('locale.buttons.edit'); $nestedData['show'] = route('customer.keywords.show', $keyword->uid); $nestedData['renew_label'] = __('locale.labels.renew'); $nestedData['renew'] = route('customer.keywords.pay', $keyword->uid); $nestedData['release'] = __('locale.labels.release'); $data[] = $nestedData; } } $json_data = [ "draw" => intval($request->input('draw')), "recordsTotal" => intval($totalData), "recordsFiltered" => intval($totalFiltered), "data" => $data, ]; echo json_encode($json_data); exit(); } /** * @return Application|Factory|View * @throws AuthorizationException */ public function create() { $this->authorize('create_keywords'); $breadcrumbs = [ ['link' => url('dashboard'), 'name' => __('locale.menu.Dashboard')], ['link' => url('keywords'), 'name' => __('locale.menu.Keywords')], ['name' => __('locale.keywords.create_new_keyword')], ]; if (Auth::user()->customer->getOption('sender_id_verification') == 'yes') { $sender_ids = Senderid::where('user_id', auth()->user()->id)->where('status', 'active')->cursor(); $phone_numbers = PhoneNumbers::where('user_id', auth()->user()->id)->where('status', 'assigned')->cursor(); } else { $sender_ids = null; $phone_numbers = null; } return view('customer.keywords.create', compact('breadcrumbs', 'sender_ids', 'phone_numbers')); } /** * @param StoreKeywordsRequest $request * * @param Keywords $keyword * * @return RedirectResponse * @throws AuthorizationException */ public function store(StoreKeywordsRequest $request, Keywords $keyword): RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('admin.keywords.create')->withInput($request->except('_token'))->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->authorize('create_keywords'); $this->keywords->store($request->except('_token'), $keyword::billingCycleValues()); return redirect()->route('customer.keywords.index')->with([ 'status' => 'success', 'message' => __('locale.keywords.keyword_successfully_added'), ]); } /** * show available keywords * * @return Application|Factory|\Illuminate\Contracts\View\View * @throws AuthorizationException */ public function buy() { $this->authorize('buy_keywords'); $breadcrumbs = [ ['link' => url('dashboard'), 'name' => __('locale.menu.Dashboard')], ['link' => url('keywords'), 'name' => __('locale.menu.Keywords')], ['name' => __('locale.keywords.buy_keyword')], ]; return view('customer.keywords.buy', compact('breadcrumbs')); } /** * @param Request $request * * @return void * @throws AuthorizationException */ #[NoReturn] public function available(Request $request) { $this->authorize('buy_keywords'); $columns = [ 0 => 'responsive_id', 1 => 'uid', 2 => 'uid', 3 => 'title', 4 => 'keyword_name', 5 => 'price', 6 => 'actions', ]; $totalData = Keywords::where('status', 'available')->count(); $totalFiltered = $totalData; $limit = $request->input('length'); $start = $request->input('start'); $order = $columns[$request->input('order.0.column')]; $dir = $request->input('order.0.dir'); if (empty($request->input('search.value'))) { $keywords = Keywords::where('status', 'available')->offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); } else { $search = $request->input('search.value'); $keywords = Keywords::where('status', 'available')->whereLike(['uid', 'title', 'keyword_name', 'price'], $search) ->offset($start) ->limit($limit) ->orderBy($order, $dir) ->get(); $totalFiltered = Keywords::where('status', 'available')->whereLike(['uid', 'title', 'keyword_name', 'price'], $search)->count(); } $data = []; if ( ! empty($keywords)) { foreach ($keywords as $keyword) { $nestedData['responsive_id'] = ''; $nestedData['uid'] = $keyword->uid; $nestedData['title'] = $keyword->title; $nestedData['buy'] = __('locale.labels.buy'); $nestedData['keyword_name'] = $keyword->keyword_name; $nestedData['price'] = "<div> <p class='text-bold-600'>".Tool::format_price($keyword->price, $keyword->currency->format)." </p> <p class='text-muted'>".$keyword->displayFrequencyTime()."</p> </div>"; $nestedData['checkout'] = route('customer.keywords.pay', $keyword->uid); $data[] = $nestedData; } } $json_data = [ "draw" => intval($request->input('draw')), "recordsTotal" => intval($totalData), "recordsFiltered" => intval($totalFiltered), "data" => $data, ]; echo json_encode($json_data); exit(); } /** * View currency for edit * * @param Keywords $keyword * * @return Application|Factory|View * * @throws AuthorizationException */ public function show(Keywords $keyword) { $this->authorize('update_keywords'); $breadcrumbs = [ ['link' => url('dashboard'), 'name' => __('locale.menu.Dashboard')], ['link' => url('keywords'), 'name' => __('locale.menu.Keywords')], ['name' => __('locale.keywords.update_keyword')], ]; if (Auth::user()->customer->getOption('sender_id_verification') == 'yes') { $sender_ids = Senderid::where('user_id', auth()->user()->id)->where('status', 'active')->cursor(); $phone_numbers = PhoneNumbers::where('user_id', auth()->user()->id)->where('status', 'assigned')->cursor(); } else { $sender_ids = null; $phone_numbers = null; } return view('customer.keywords.show', compact('breadcrumbs', 'keyword', 'sender_ids', 'phone_numbers')); } /** * @param Keywords $keyword * @param CustomerUpdate $request * * @return RedirectResponse */ public function update(Keywords $keyword, CustomerUpdate $request): RedirectResponse { if (config('app.stage') == 'demo') { return redirect()->route('customer.keywords.show', $keyword->uid)->with([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->keywords->updateByCustomer($keyword, $request->except('_method', '_token')); return redirect()->route('customer.keywords.show', $keyword->uid)->with([ 'status' => 'success', 'message' => __('locale.keywords.keyword_successfully_updated'), ]); } /** * remove mms file * * @param Keywords $keyword * * @return JsonResponse */ public function removeMMS(Keywords $keyword): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } if ( ! $keyword->where('user_id', Auth::user()->id)->update(['reply_mms' => null])) { return response()->json([ 'status' => 'error', 'message' => __('locale.exceptions.something_went_wrong'), ]); } return response()->json([ 'status' => 'success', 'message' => __('locale.keywords.keyword_mms_file_removed'), ]); } /** * @param Keywords $keyword * @param $id * * @return JsonResponse Controller|JsonResponse * * @throws AuthorizationException */ public function release(Keywords $keyword, $id): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $this->authorize('release_keywords'); $this->keywords->release($keyword, $id); return response()->json([ 'status' => 'success', 'message' => __('locale.keywords.keyword_successfully_released'), ]); } /** * batch release * * @param Request $request * * @return JsonResponse */ public function batchAction(Request $request): JsonResponse { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry! This option is not available in demo mode', ]); } $ids = $request->get('ids'); $keywords = Keywords::where('user_id', Auth::user()->id)->whereIn('uid', $ids)->cursor(); foreach ($keywords as $keyword) { $keyword->user_id = 1; $keyword->status = 'available'; $keyword->validity_date = null; $keyword->save(); } return response()->json([ 'status' => 'success', 'message' => __('locale.keywords.keyword_successfully_released'), ]); } /** * checkout * * @param Keywords $keyword * * @return Application|Factory|\Illuminate\Contracts\View\View * @throws AuthorizationException */ public function pay(Keywords $keyword) { $this->authorize('buy_keywords'); $pageConfigs = [ 'bodyClass' => 'ecommerce-application', ]; $breadcrumbs = [ ['link' => url('dashboard'), 'name' => __('locale.menu.Dashboard')], ['link' => url('dashboard'), 'name' => __('locale.menu.Sending')], ['link' => url('keywords'), 'name' => __('locale.menu.Keywords')], ['name' => __('locale.labels.checkout')], ]; $payment_methods = PaymentMethods::where('status', true)->cursor(); return view('customer.keywords.checkout', compact('breadcrumbs', 'pageConfigs', 'keyword', 'payment_methods')); } /** * pay sender id payment * * @param Keywords $keyword * @param PayPaymentRequest $request * * @return Application|Factory|\Illuminate\Contracts\View\View|RedirectResponse */ public function payment(Keywords $keyword, PayPaymentRequest $request) { $data = $this->keywords->payPayment($keyword, $request->except('_token')); if ($data->getData()->status == 'success') { if ($request->payment_methods == 'braintree') { return view('customer.Payments.braintree', [ 'token' => $data->getData()->token, 'keyword' => $keyword, 'post_url' => route('customer.keywords.braintree', $keyword->uid), ]); } if ($request->payment_methods == 'stripe') { return view('customer.Payments.stripe', [ 'session_id' => $data->getData()->session_id, 'publishable_key' => $data->getData()->publishable_key, 'keyword' => $keyword, ]); } if ($request->payment_methods == 'authorize_net') { $months = [1 => 'Jan', 2 => 'Feb', 3 => 'Mar', 4 => 'Apr', 5 => 'May', 6 => 'Jun', 7 => 'Jul', 8 => 'Aug', 9 => 'Sep', 10 => 'Oct', 11 => 'Nov', 12 => 'Dec']; return view('customer.Payments.authorize_net', [ 'months' => $months, 'keyword' => $keyword, 'post_url' => route('customer.keywords.authorize_net', $keyword->uid), ]); } if ($request->payment_methods == 'offline_payment') { return view('customer.Payments.offline', [ 'data' => $data->getData()->data, 'type' => 'keyword', 'post_data' => $keyword->uid, ]); } return redirect()->to($data->getData()->redirect_url); } return redirect()->route('customer.keywords.pay', $keyword->uid)->with([ 'status' => 'error', 'message' => $data->getData()->message, ]); } }