!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/picotext.picotech.app/public_html/app/Http/Controllers/Customer/   drwxr-xr-x
Free 28.9 GB of 117.98 GB (24.5%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     ComposeController.php (12.35 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

namespace App\Http\Controllers\Customer;

use 
App\Events\SendMail;
use 
App\Http\Controllers\Controller;
use 
App\Models\Contact;
use 
App\Models\ContactGroup;
use 
App\Models\CreditHistory;
use 
App\Models\CustomerNumber;
use 
App\Models\Number;
use 
App\Models\Report;
use 
App\Models\SenderId;
use 
App\Models\SentFail;
use 
App\Models\WhatsAppNumber;
use 
App\SmsProvider\SendSMS;
use 
App\VoiceCallProvider\SendVoiceCallProcess;
use 
App\WhatsAppProvider\SendMessageProcess;
use 
Carbon\Carbon;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Facades\DB;
use 
Illuminate\Support\Facades\Log;

class 
ComposeController extends Controller
{
    public function 
index(Request $request)
    {
        
$user auth()->guard('customer')->user();

        
$usersToGroups = [];
        
$usersToContacts = [];
        foreach (
$user->active_groups as $group) {
            
$usersToGroups[] = ['value' => $group->name'id' => $group->id'type' => 'group'];
        }
        foreach (
$user->contacts()->limit(10000)->get() as $contact) {
            
$usersToContacts[] = ['value' => isset($contact->first_name) ? $contact->contact_dial_code $contact->number ' (' $contact->first_name ' ' $contact->last_name ')' $contact->contact_dial_code $contact->number'id' => $contact->id'type' => 'contact'];
        }


        
$data['users_to_contacts'] = $usersToContacts;
        
$data['users_to_groups'] = $usersToGroups;
        
$data['from_type'] = $request->type;

        return 
view('customer.smsbox.compose'$data);
    }

    public function 
getSenders(Request $request)
    {

        
$numbers auth('customer')->user()->numbers()->where('type'$request->type)->where('status''active')->select(['id''number'])->get();

        if (
count($numbers) <= 0) {
            return 
response()->json(['status' => 'failed']);
        }

        return 
response()->json(['data' => $numbers'status' => 'success']);
    }

    public function 
sentCompose(Request $request)
    {
        if (
env("APP_DEMO")) {
            return 
redirect()->back()->withErrors(['msg' => trans('admin.app_demo_message')]);
        }
        
$request->validate([
            
'from_number' => 'required',
            
'to_numbers' => 'required|array',
            
'body' => 'required',
        ]);

        
$messageFiles = [];
        
$sendFailed = [];
        if (
$request->mms_files) {

            foreach (
$request->mms_files as $key => $file) {
                
$messageFiles[] = $fileName time() . $key '.' $file->extension();
                
$file->move(public_path('uploads/'), $fileName);
            }
            
$request['message_files'] = json_encode($messageFiles);
        }
        if (
$request->file_mp3) {
            
$fileName time() . '.' $request->file_mp3->extension();
            
$request->file_mp3->move(public_path('uploads/'), $fileName);
            
$request['message_files'] = $fileName;
        }

        if (isset(
$request->isSchedule)) {
            
$sd Carbon::createFromTimeString($request->schedule);
            
$request['schedule_datetime'] = $sd;
            
$schedule_completed 'no';
        } else {
            
$request['schedule_datetime'] = now();
            
$schedule_completed 'yes';
        }
        
$allToNumbers = [];
        
$allGroupIds = [];
        
$allContactIds = [];

        foreach (
$request->to_numbers as $item) {
            
$number = (array)json_decode($item);
            if (isset(
$number['type']) && isset($number['id'])) {
                if (
$number['type'] == 'contact') {
                    
$allContactIds[] = $number['id'];
                } elseif (
$number['type'] == 'group') {
                    
$allGroupIds[] = $number['id'];
                }
            } else {
                
$allToNumbers[] = $item;
            }
        }

        
$contactNumbers Contact::select('id''number')->whereIn('id'$allContactIds)->get();
        
$groupNumbers ContactGroup::with('contact')->whereIn('group_id'$allGroupIds)->get();

        foreach (
$contactNumbers as $cn) {
            
$allToNumbers[] = trim($cn->number);
        }
        foreach (
$groupNumbers as $gn) {
            
$allToNumbers[] = trim($gn->contact->number);
        }

        
$numberForm auth('customer')->user()->numbers()->where('id'$request->from_number)->where('status''active')->firstOrFail();
        
$gateway auth('customer')->user()->gateways()->where('id'$numberForm->dynamic_gateway_id)->firstOrFail();

        
$number_form $numberForm->number;


        
$allToNumbers array_unique($allToNumbers);

        
$request['to_numbers'] = $allToNumbers;
        
$request['numbers'] = json_encode(['from' => $number_form'to' => $allToNumbers]);
        
$request['type'] = 'sent';


        
$totalCount 1;
        
$requestCharacters $request->body;
        
$characters mb_strlen($requestCharacters"UTF-8");
        if (
strlen($requestCharacters) != strlen(utf8_decode($requestCharacters))) {
            if (
$characters && $characters 70) {
                
$grandTotal ceil($characters 70);
                if (
$grandTotal 1)
                    
$totalCount $grandTotal;
            }
        } else {
            if (
$characters && $characters 160) {
                
$grandTotal ceil($characters 160);
                if (
$grandTotal 1)
                    
$totalCount $grandTotal;
            }
        }


        
//send sms here using API
        
$number $numberForm;
        if (!
$number)
            return 
back()->with('fail''Number not found please contact with administrator');

        
$numb $number->number;


        
DB::beginTransaction();
        try {
            foreach (
$request->to_numbers as $to) {

                if (
$request->from_type == 'whatsapp_number') {
                    
$to 'whatsapp:' $to;
                }

                
$smsQueue auth('customer')->user()->messages()->create([
                    
'from' => $numb,
                    
'to' => $to,
                    
'schedule_datetime' => $request->schedule_datetime,
                    
'schedule_completed' => $schedule_completed,
                    
'body' => $request->body,
                    
'created_at' => now(),
                    
'updated_at' => now(),
                    
'message_files' => $request->message_files,
                    
'type' => 'sent',
                    
'dynamic_gateway_id' => $gateway->id,
                ]);

                
$sendSMS = new SendSMS();
                
$sendSMS->setMessage($smsQueue)
                    ->
process();

            }


            
DB::commit();
            if (!
$request->ajax()) {
                return 
back()->with('success''Message sent successfully');
            } else {
                return 
response()->json(['status' => 'success''message' => 'Message sent successfully']);
            }
        } catch (
\Exception $ex) {
            
Log::error($ex);
            
DB::rollBack();
            if (
$request->ajax()) {
                return 
response()->json(['status' => 'failed''message' => $ex->getMessage()]);
            } else {
                return 
back()->with('fail'$ex->getMessage());
            }
        }
    }

    public function 
queueList(Request $request)
    {

        
$data['queuesList'] = auth('customer')->user()->messages()->whereNotNull('schedule_datetime')->whereNull('delivered_at')->orderBy('created_at''desc')->paginate(10);
        return 
view('customer.smsbox.queue'$data);
    }

    public function 
overview()
    {
        return 
view('customer.smsbox.overview');
    }

    public function 
overview_get_data(Request $request)
    {
        
$overview auth('customer')->user()->messages()->select(['id''body''status''updated_at','created_at''from''to''type''delivered_at''failed_reason''schedule_datetime''schedule_completed']);


        if (
$request->type && $request->type == 'trash') {
            
$overview $overview->onlyTrashed();
        } else if (
$request->type) {
            
$overview $overview->where('type'$request->type);
        }
        if (
$request->status && $request->status == 'queue') {
            
$overview $overview->where('status''running')->where('schedule_completed''no')->whereNotNull('schedule_datetime')->whereNull('delivered_at');
        } elseif (
$request->status) {
            
$overview $overview->where('status'$request->status);
        }

        if (
$request->from_date && $request->to_date) {
            
$overview $overview->whereBetween('created_at', [$request->from_date$request->to_date]);
        }

        return 
datatables()->of($overview)
            ->
addColumn('body', function ($q) {
                return 
"<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>" htmlentities($q->body) . '</div>';
            })
            ->
addColumn('status', function ($q) {
                if (
$q->status == 'succeed') {
                    if (
$q->delivered_at) {
                        
$status 'Delivered At: ' formatDate($q->delivered_at);
                    } else {
                        
$status 'Received At: ' formatDate($q->created_at);
                    }
                } elseif (
$q->status == 'failed') {
                    if (
$q->failed_reason) {
                        
$status "<div class='show-more' style='max-width: 500px;white-space: pre-wrap'>Failed Reason: " $q->failed_reason '</div>';
                    } else {
                        
$status 'Failed Reason: n/a';
                    }
                } elseif (
$q->status == 'running' && $q->schedule_completed == 'no' && $q->schedule_datetime) {
                    
$status 'Queued At: ' formatDate($q->schedule_datetime);
                } else {
                    
$status ucfirst($q->status);
                }
                return 
$status;
            })
            ->
addColumn('action', function ($q) {
                return 
'<button class="btn btn-sm btn-danger" data-message="Are you sure you want to delete this message?"
                                        data-action=' 
route('customer.smsbox.overview.data.delete', ['id' => $q]) . '
                                        data-input={"_method":"delete"}
                                        data-toggle="modal" data-target="#modal-confirm">Delete</button>'
;
            })
            ->
rawColumns(['action''status''body'])
            ->
toJson();
    }

    public function 
overview_data_delete(Request $request)
    {
        
$request->validate([
            
'id' => 'required'
        
]);
        
$ids explode(','$request->id);
        
auth('customer')->user()->messages()->whereIn('id'$ids)->delete();
        return 
back()->with('success''Message successfully moved to trash');
    }

    public function 
smsCalculate(Request $request)
    {
        
$request->validate([
            
'from_type' => 'required',
            
'to_numbers.*' => 'required',
            
'message' => 'required'
        
]);

        
$totalCount 1;
        
$requestCharacters $request->message;
        
$characters mb_strlen($requestCharacters"UTF-8");
        if (
strlen($requestCharacters) != strlen(utf8_decode($requestCharacters))) {
            if (
$characters && $characters 70) {
                
$grandTotal ceil($characters 70);
                if (
$grandTotal 1)
                    
$totalCount $grandTotal;
            }
        } else {
            if (
$characters && $characters 160) {
                
$grandTotal ceil($characters 160);
                if (
$grandTotal 1)
                    
$totalCount $grandTotal;
            }
        }
        
$currentPlan auth('customer')->user()->plan;
        if (
$request->from_type == 'phone_number') {
            
$rate $currentPlan->non_masking_rate;
        } elseif (
$request->from_type == 'sender_id') {
            
$rate $currentPlan->masking_rate;
        } elseif (
$request->from_type == 'whatsapp_number') {
            
$rate $currentPlan->whatsapp_rate;
        }


        
$number count($request->to_numbers);
        
$totalSms $totalCount $number;
        
$totalRate $rate $totalSms;
        return 
response()->json(['status' => 'success''data' => ['totalSms' => $totalSms'totalNumber' => $number'totalRate' => $totalRate]]);

    }

    public function 
webhookLists()
    {
        
$allGateways = [];
        foreach (
getAllSmsGateway() as $gateway) {
            
$allGateways[$gateway] = route('inbound.process', [$gateway]);
        }
        return 
view('customer.smsbox.inbound_webhook'compact('allGateways'));
    }

}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0042 ]--