<?php
defined('COT_CODE') or die('Wrong URL');

$return['success'] = 0;
$return['error'] = '';

$sms_cfg = array(
 'smsattemptslimit' => 3, //Лимит попыток получить код - 3
 'smsattemptstimeout' => 180, //Следующая попытка получить код (в секундах) - 180
 'testmode' => 0
);

$sms_provider = 'smsru';

if($usr['id'] > 0 && cot_plugin_active($sms_provider)) {
  if ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' || 1 == 1) {
    $a = cot_import('a', 'G', 'TXT');
    $area = cot_import('area', 'G', 'TXT');

    require_once cot_incfile($sms_provider, 'plug');
    if(isset($cfg['plugin'][$sms_provider]['testmode']))
      $sms_cfg['testmode'] = $cfg['plugin'][$sms_provider]['testmode'];

    function sms_generatecode($area = '', $phone, $length = 6, $use_cookie = true, $uniq = ''){
    	global $cfg, $sys;

    	if (!$uniq) $uniq = cot_unique($length);
    	$uniq = str_replace(str_split('abcdef'), str_split('012345'), strtoupper($uniq));
    	$uhash = sha1($uniq.$phone.$sys['xk']);
    	if ($use_cookie) {
    		setcookie($area.'_schash', $uhash, time()+24*60*60, '/');
    	}

    	return array($uniq, $uhash);
    }

    function sms_checkcode($area = '', $phone, $code, $hash = ''){
    	global $cfg, $sys;

    	if (!$hash) {
    		$hash = cot_import($area.'_schash', 'C', 'ALP');
    	}
      $valid = ($hash == sha1($code.$phone.$sys['xk']));

    	return $valid;
    }

  	switch ($a) {
  		case 'getcode':
        $return['success'] = 1;

  			$timenow = cot_import('timenow', 'G', 'INT');
  			$area = cot_import('area', 'G', 'ALP');
  			$to = cot_import('phone', 'G', 'TXT');

        if (!empty($usr['profile']['user_phone'])) {
          $to = $usr['profile']['user_phone'];
        } else {
          $to = cot_user_checkphone($to, true);
        }

  			$nextattempttime = cot_import($area.'_nextattempttime', 'C', 'INT');
  			$attemptslockedtime = cot_import($area.'_attemptslockedtime', 'C', 'INT');
  			$attempts = cot_import($area.'_attempts', 'C', 'INT');

  			$chphone = md5($to.$sys['site_id']);
  			$lastphone = cot_import($area.'_lastphone', 'C', 'TXT');

  			if($attemptslockedtime != 0 && $attemptslockedtime < $sys['now']){
  				setcookie($area.'_attemptslockedtime', 0);
  				setcookie($area.'_attempts', 0);
  			}

  			if(!empty($to)){
  				$user_exists = $db->query("SELECT user_id FROM $db_users WHERE user_phone='".$to."' AND user_id!=".$usr['id']." LIMIT 1")->fetchColumn();
  				if(!$user_exists){
  					// Если не превышено количество попыток
  					if($attempts < $sms_cfg['smsattemptslimit']){
  						// Номер не совпадает с предыдущим
  						if($chphone != $lastphone){
  							setcookie($area.'_nextattempttime', 0, time()+24*60*60, '/');
  							$code = sms_generatecode($area, $to);
  							$sms_param = array(
  								'to'=> $to,
  								'text'=> 'Код подтверждения: '.$code[0].'.'
  							);
  							$id = 0;

                /* sms_send */
                if($sms_cfg['testmode']) {
                  $id = 999999;
                } else {
                	if($sms_provider == 'smsru') {
                    global $smsru;
                    $id = $smsru->send($sms_param);
                  }
                }
                cot_log('send sms (id '.$id.') to '.$sms_param['to'].': '.$sms_param['text']);
                /* sms_send */

                if ($id) {
    							$attempts++;

    							setcookie($area.'_lastphone', $chphone, time()+24*60*60, '/');
    							setcookie($area.'_phone', $to, time()+3*60, '/');
    							setcookie($area.'_attempts', $attempts, time()+24*60*60, '/');
    							setcookie($area.'_nextattempttime', $timenow+$sms_cfg['smsattemptstimeout'], time()+24*60*60, '/');
    							$status = 'success';
    						} else {
    							$status = 'smsnotsended';
    						}
    					// Номер совпадает с предыдущим, то вывод поля ввода кода без повторной отправки смс
    					}else{
    						$status = 'showlastcode';
    					}
  					// Если превышено количество попыток
  					}else{
  						// и введен последний номер
  						if($chphone == $lastphone){
  							$status = 'showlastcode';
  						// иначе вывод сообщения что попытки исчерпаны
  						}else{
  							setcookie($area.'_attemptslockedtime', time()+24*60*60, time()+24*60*60, '/');
  							$status = 'attemptslocked';
  						}
  					}
  				} else {
  					$status = 'userexists';
  				}
  			} elseif(!empty($to)) {
  				$status = 'smsnotsended';
  			} else {
  				$status = 'phoneempty';
  			}
  			$data['attempts'] = $attempts;
  		break;

  		case 'checkcode':
        $return['success'] = 1;

  			$area = cot_import('area', 'G', 'ALP');
  			$code = cot_import('code', 'G', 'ALP');
  			$schash = cot_import($area.'_schash', 'C', 'TXT');
        $phone = cot_import('phone', 'G', 'ALP');
  			if(!empty($schash)) {
  				if(sms_checkcode($area, $phone, $code, $schash)) {
            setcookie($area.'_valid_code', $code, time()+60, '/');
            setcookie($area.'_valid_phone', $phone, time()+60, '/');

  					$status = 'success';
  				} else {
  					$status = 'wrongcode';
  				}
  			} else {
  				$status = 'codeexpired';
  			}
  		break;
  	}

    $return['smsstatus'] = $status;
    $return['smsattemptslimit'] = $sms_cfg['smsattemptslimit'];
    $return['data'] = $data;
  } else {
    $return['error'] = 'NaAQ (not an ajax query)';
  }
}

?>