<?php

defined('BASEPATH') or exit('No direct script access allowed');



class Invite extends MY_Controller

{

    public function __construct()

    {

        parent::__construct();

    }



    private function generateGuid()

    {

        return sprintf(

            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

            mt_rand(0, 65535),

            mt_rand(0, 65535),

            mt_rand(0, 65535),

            mt_rand(16384, 20479),

            mt_rand(32768, 49151),

            mt_rand(0, 65535),

            mt_rand(0, 65535),

            mt_rand(0, 65535)

        );

    }



    public function create_order()

    {

        $processor = $this->input->get('processor');

        $email = $this->input->get('email');

        $processors = array(

            'pp' => 'paypal',

            'cc' => 'credit_card',

            'crypto' => 'crypto',

        );



        if (array_key_exists($processor, $processors)) {

            $amount = 19.99;

            $package = 'register';



            if ($processor == 'cc') {

                $invoice = $this->generateGuid();

         

                $invoice_page = $this->_singularity_create_invoice_untrusted($invoice, $email, 1999);



                if (!$invoice_page) {

                    $invoice = false;

                }

            }



            if (!$invoice) {

                return $this->output

                    ->set_content_type('application/json')

                    ->set_status_header(400)

                    ->set_output(json_encode(array('error' => 'Une erreur est survenue lors du paiement. Veuillez réessayer avec un autre moyen de paiement.')));

            } else {

                $data_db = array(

                    'user_id' => 0,

                    'invoice_id' => $invoice,

                    'invoice_page' => $invoice_page,

                    'processor' => $processors[$processor],

                    'package' => $package,

                    'amount' => $amount,

                    'created' => time()

                );



                $this->db->insert('orders', $data_db);



                return $this->output->set_content_type('application/json')

                    ->set_output(json_encode(array('invoice_id' => $invoice, 'package' => $package, 'amount' => $amount, 'processor' => $processors[$processor], 'invoice_page' => $invoice_page)));

            }

        }

    }



    private function _singularity_create_invoice_untrusted($invoice, $email, $amount)

    {

        $curl = curl_init();



        $postFields = [

            'amount' => $amount,

            'currency' => 'EUR',

            'return_url' => 'https://www3.yggtorrent.cool/invite/register?show=invite_sent',

            'description' => "Invoice '.$invoice.'",

            'session_expiry' => 2592000,

            'profile_id' => 'pro_aJUftBNCMyxIxZQyFZiP',

            'metadata' => [

                'order_id' => $invoice,

                'email' => $email

            ],

            'payment_link' => false,

            'confirm' => true,

            'payment_method' => 'card_redirect',

            'payment_method_type' => 'card_redirect',

            'payment_method_data' => [

                'card_redirect' => [

                    'card_redirect' => []

                ]

            ],

            'payment_experience' => 'redirect_to_url',

        ];

        $jsonData = json_encode($postFields);



        curl_setopt_array(

            $curl,

            array(

                CURLOPT_URL => 'https://api.singularitytools.net/payments',

                CURLOPT_RETURNTRANSFER => true,

                CURLOPT_ENCODING => '',

                CURLOPT_MAXREDIRS => 10,

                CURLOPT_TIMEOUT => 0,

                CURLOPT_FOLLOWLOCATION => true,

                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

                CURLOPT_CUSTOMREQUEST => 'POST',

                CURLOPT_POSTFIELDS => $jsonData,

                CURLOPT_HTTPHEADER => array(

                    'api-key: prd_xjfy2vGdfGg5tG7FdSY8y854BBwY1PPlZcaVRkMHrq8K6AKFGkUCXF3BSmfZufw2',

                    'Content-Type: application/json'

                ),

            )

        );





        $output = curl_exec($curl);



        if (curl_errno($curl) || !$output) {

            curl_close($curl);

            return false;

        }



        $output = json_decode($output, true);

        curl_close($curl);



        if (isset($output['next_action'])) {

            return $output['next_action']['redirect_to_url'];

        } else {

            return false;

        }

    }



    public function register()

    {

        //  echo random_string('alnum', 45);





        $invite_code = $this->input->get('invite_code', true);

        $show = $this->input->get('show', true);



        if ($show == 'invite_sent') {

            $this->load->view('user/register_invite_sent');

        } else if (empty($_GET['invite_code'])) {

            echo 'Code d\\'invitation invalide';

        } else {



            $invite = $this->db->where('invite_code', $invite_code)->get('invites')->row();



            if (!$invite) {

                echo 'Code d\\'invitation non trouvé';

            } else if ($invite->used == 1) {

                echo 'Code d\\'invitation déjà utilisé';

            } else {

                $data['invite_code'] = $invite->invite_code;

                $data['captcha_error'] = '';

                $data['hide_form'] = false;

                $this->form_validation->set_rules('email', '<strong>email</strong>', 'required|valid_email|trim|xss_clean');

                $this->form_validation->set_rules('nickname', '<strong>pseudo</strong>', 'required|trim|min_length[3]|max_length[30]|alpha_dash|xss_clean');

                $this->form_validation->set_rules('pass', '<strong>mot de passe</strong>', 'required|trim|min_length[5]|max_length[40]|xss_clean');

                $this->form_validation->set_rules('passconfirm', '<strong>confirmation mdp</strong>', 'required|trim|min_length[5]|max_length[40]|matches[pass]|xss_clean');



                if ($this->form_validation->run()) {

                    $data_account['email'] = strtolower($this->input->post('email'));

                    $data_account['nickname'] = ucfirst($this->input->post('nickname'));

                    $data_account['salt'] = hash('sha512', uniqid(mt_rand(), true));

                    $to_hash = $data_account['salt'] . $this->input->post('pass') . $this->config->item('secret_key');



                    $data_account['pass'] = hash('sha512', $to_hash);

                    $data_account['join_date'] = now();

                    $data_account['is_valid'] = 1;

                    $data_account['is_donator'] = 1;

                    $data_account['torrent_pass'] = generatePasskey();

                    $data_account['uploaded'] = (1073741274 * 50);

                    $data_account['download_multiplier'] = 1;

                    $data_account['downloaded'] = 1073741274;

                    $data_account['settings'] = '{"pm":{"enable":true,"condition_sender_age":"2weeks"},"enable_at_content":false}';



                    $data_account['token_validation'] = bin2hex(openssl_random_pseudo_bytes(16));

                    $response = $this->checkmail($data_account['email']);

                    $domain = substr(strrchr($data_account['email'], '@'), 1);

                    $blacklist_domains = array_map('trim', $this->getSettings('reg_blacklist'));

                    $whitelist_domains = array_map('trim', $this->getSettings('reg_whitelist'));



                    if (strpos($data_account['email'], '+')) {

                        $data['message'] = '<div class="alert alert-danger">Impossible d\\'utiliser cette adresse e-mail pour s\\'inscrire</div>';

                    } else {

                        if (($response || in_array($domain, $blacklist_domains)) && !in_array($domain, $whitelist_domains)) {

                            $data['message'] = '<div class="alert alert-danger">Impossible d\\'utiliser une adresse e-mail jetable pour s\\'inscrire</div>';

                        } else {

                            if (!$this->db->insert('users', $data_account)) {

                                $error = $this->db->error();



                                if (strpos($error['message'], 'nickname') !== false) {

                                    $data['message'] = '<div class="alert alert-danger">Le pseudo que vous avez renseigné a déjà été utilisé</div>';

                                } else {

                                    $data['message'] = '<div class="alert alert-danger">L\\'adresse e-mail que vous avez renseigné a déjà été utilisée</div>';

                                }

                            } else {

                                $user_id = $this->db->insert_id();



                                if (isset($_POST['session_id']) && trim($_POST['session_id']) != '') {

                                    $fp_data = array(

                                        'user_id' => $user_id,

                                        'fp' => $this->input->post('session_id'),

                                        'date' => now()

                                    );

                                    $this->db->insert('users_fp', $fp_data);

                                }



                                $this->db->where('id', (int) $invite->id)

                                    ->set('used', 1)

                                    ->set('created_user', $user_id)

                                    ->update('invites');



                                $data['message'] = '<div class="alert alert-success">Compte créé ! Vous pouvez désormais vous connecter.</div>';

                                $data['hide_form'] = true;



                                $this->cache->redis->save('user:' . strtolower($data_account['nickname']), $user_id, 1200);

                            }



                        }



                    }

                }



                $error_validation = array_values($this->form_validation->error_array())[0];

                if (!empty($error_validation)) {

                    $data['message'] = '<div class="alert alert-danger">' . $error_validation . '</div>';

                }



                $this->load->view('user/register_invite', $data);



            }





        }



    }



    public function checkmail($email)

    {

        $result = '0';

        $domain = substr(strrchr($email, '@'), 1);



        if (function_exists('curl_init')) {

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, 'https://www.block-trashmail.space/api/' . $domain);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);

            $result = curl_exec($ch);

            curl_close($ch);

        } else {

            $result = file_get_contents('https://www.block-trashmail.space/api/' . $domain);

        }



        if ($result == '1') {

            return true;

        }

        return false;

    }





}

