403Webshell
Server IP : 95.46.96.79  /  Your IP : 216.73.216.84
Web Server : Apache/2.4.41 (Ubuntu)
System : Linux zaimer.uz 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User : akslabs_uz_usr ( 1001)
PHP Version : 7.4.3-4ubuntu2.29
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/sugurtatrip__usr95/data/www/sugurtatrip.uz/apiv1/user/Services/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/sugurtatrip__usr95/data/www/sugurtatrip.uz/apiv1/user/Services/SMSConfirmationService.php
<?php

require_once __DIR__ . '/../Core/HttpClient.php';
require_once __DIR__ . '/../database/Database.php';
require_once __DIR__ . '/../Core/Logger.php';
require_once __DIR__ . '/../Models/ErrorCodes.php';
require_once __DIR__ . '/../Models/ErrorMessages.php';
// require_once __DIR__ . '/../Models/MessageTemplates.php';

class SMSConfirmationService
{
    private $sms_service_url;

    public function __construct()
    {
        $this->sms_service_url = $_ENV['SMS_SERVICE_URL'];
    }

    public function request_code($data) {
        $lang = $data['lang'];
        $code = $this->generateCode();
        $result = [
            'success' => false,
            'data' => null,
            'error' => null,
            'error_message' => null
        ];

        try {
            $existing_user = $this->userExists($data['phone']);
            $user_id = $existing_user ? $existing_user : null;
    
            if (!$user_id) {
                throw new \Exception(ErrorMessages::USER_NOT_FOUND);
            }
    
            $code_id = $this->createConfirmationCode($user_id, $code);
    
            if (!$code_id) {
                throw new \Exception(ErrorMessages::FAILED_CODE_CREATION);
            }

            $message_template = $lang === 'uz' ? $_ENV['SMS_TEMPLATE_UZ'] : $_ENV['SMS_TEMPLATE_RU'];

            $sms_result = $this->sendSMS($data['phone'], $code, $message_template);
    
            if ($sms_result['http_code'] !== 200) {
                throw new \Exception(ErrorMessages::FAILED_SMS_SEND . ': ' . print_r($sms_result, true));
            }

            $result['success'] = true;
            $result['data'] = [
                'client_id' => $user_id,
                'client_phone' => $data['phone'],
                'code_id' => $code_id
            ];
        } catch (\Exception $e) {
            $result['error'] = $e->getCode();
            $result['error_message'] = $e->getMessage();
        }

        return $result;
    }

    public function confirm_code($data) {
        $result = [
            'success' => false,
            'data' => null,
            'error' => null,
            'error_message' => null
        ];

        try {
            $db = new Database();
            $query = "SELECT * FROM sended_codes WHERE id = " . intval($data['codeId']);
            $db_data = $db->query($query);
    
            if ($db_data && $db_data->num_rows > 0) {
                $row = $db_data->fetch_assoc();
                
                if ($row['confirmed'] == 1) {
                    $result['error'] = ErrorCodes::CODE_CONFIRMED;
                    $result['error_message'] = ErrorMessages::CODE_CONFIRMED;
                } else {
                    $timezone = new \DateTimeZone('UTC');
                    $created_at = new \DateTime($row['created_at'], $timezone);
                    $now = new \DateTime('now', $timezone);
                    $user_id = $row['client_id'];
                    
                    $interval = $now->getTimestamp() - $created_at->getTimestamp();
                    
                    if ($interval < 60) { // Check if created_at is not older than 1 minute (60 seconds)
                        if ($row['confirmation_code'] == $data['code']) {
                            // Mark the code as confirmed
                            $this->markCodeAsConfirmed($data['codeId']);
                            $result['success'] = true;
                            $result['data'] = ErrorCodes::CODE_CONFIRMED;
                            $result['user_id'] = $user_id;
                            $result['phone'] = $data['phone'];
                        } else {
                            $result['error'] = ErrorCodes::INVALID_CODE;
                            $result['error_message'] = ErrorMessages::INVALID_CODE;
                        }
                    } else {
                        $result['error'] = ErrorCodes::CODE_EXPIRED;
                        $result['error_message'] = ErrorMessages::CODE_EXPIRED;
                    }
                }
            } else {
                $result['error'] = ErrorCodes::CODE_EXPIRED;
                $result['error_message'] = ErrorMessages::CODE_EXPIRED;
            }
        } catch (\Exception $e) {
            $result['error'] = "DB_ERROR";
            $result['error_message'] = $e->getMessage();
        } finally {
            if (isset($db)) {
                $db->close();
            }
        }
    
        return $result;
    }

    private function createConfirmationCode($user_id, $code) {
        $db = new Database();
        $code_id = $db->addConfirmationCode($user_id, $code);

        return $code_id;
    }
    private function generateCode() {
        return rand(100000, 999999);
    }

    private function markCodeAsConfirmed($code_id) {
        $db = new Database();
        try {
            $query = "UPDATE sended_codes SET confirmed = 1, confirmed_at = NOW() WHERE id = " . intval($code_id);
            $db->query($query);
            $result = true;
        } catch (\Exception $e) {
            $result = false;
        } finally {
            $db->close();
        }

        return $result;
    }

    private function userExists($phone) {
        $db = new Database();
        $query = "SELECT id FROM clients WHERE client_phone = '$phone'";
        $result = $db->query($query);
        
        if ($result && $result->num_rows > 0) {
            $row = $result->fetch_assoc();
            $db->close();
            return $row['id'];
        } else {
            $db->close();
            return false;
        }
    }

    private function sendSMS($phone, $code, $message_template) {
        $data = [
            "messages" => [
                [
                    "recipient" => $phone,
                    "template-id" => $message_template,
                    "message-id" => uniqid("msg_"),
                    "variables" => [
                        "code" => $code 
                    ]
                ]
            ]
        ];

        $client = new HttpClient();
        $response = $client->post(
            $this->sms_service_url . "/send",
            $data,
            $_ENV['SMS_SERVICE_LOGIN'],
            $_ENV['SMS_SERVICE_PASSWORD']
        );

        return $response;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit