<?php
include dirname(__FILE__) . '/nocache.php';

include dirname(__FILE__) . '/dbconfig.php';
include dirname(__FILE__) . '/error.php';
include dirname(__FILE__) . '/utils.php';
include dirname(__FILE__) . '/const.php';

function check()
{

$POST_raw = file_get_contents('php://input');
$POST = json_decode($POST_raw, true);
//error_log('POST=' . var_export($POST,true));

include dirname(__FILE__) . '/session.php';

$lang = substr(setTextDomain('myapps'), 0, 2);

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'");
$dbh = new PDO(DB_DSN, DB_USER, DB_PASSWORD, $options);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

error_reporting(E_ALL & ~E_NOTICE);

$dbh->query('BEGIN');

  if ($_SERVER['REQUEST_METHOD'] != 'POST') {
    return [
      'error' => ERR_ACCOUNT_CHECK_1,
      'error_message' => _('リクエストエラー')
    ];
  }
  if ($POST['member_id'] == '') {
    return [
      'error' => ERR_ACCOUNT_CHECK_2,
      'error_message' => _('IDが入力されていません')
    ];
  }
  if ($POST['member_pass'] == '') {
    return [
      'error' => ERR_ACCOUNT_CHECK_3,
      'error_message' => _('パスワードが入力されていません')
    ];
  }
  if (isset($POST['tzoff'])) {
    $_SESSION['tzoff'] = intval($POST['tzoff']);
  }

  $tz = setTimezone($dbh);

  $sql = "SELECT * FROM userdata WHERE member_id=? AND del_flg='0'";
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array($POST['member_id']));
  $result = $stmt->fetch(PDO::FETCH_ASSOC);
  if (!$result) {
    return [
      'error' => ERR_ACCOUNT_CHECK_4,
      'error_message' => _('IDまたはパスワードが違います')
    ];
  }
  $auth = FALSE;
  if (isset($_COOKIE[COOKIE_NAME])) {
    $col = explode('.',$_COOKIE[COOKIE_NAME]);
    $data = base64_decode($col[0]);
    $sig  = base64_decode($col[1]);
    $file = file_get_contents('/var/www/pub.pem');
    $pub  = openssl_pkey_get_public($file);
    if (openssl_verify($data, $sig, $pub)) {
        $temp = explode(':',$data);
        if ($temp[0] == $result['member_id']) {
            $work = $result['member_id'] . ':' . $result['member_pass'] . ':' . $temp[1];
            $hash = openssl_digest($work, 'md5');
            if ($hash == $POST['member_pass']) {
                $auth = TRUE;
            }
        }
    }
  }
  if ($auth == FALSE && $POST['member_pass'] != $result['member_pass']) {
    return [
      'error' => ERR_ACCOUNT_CHECK_5,
      'error_message' => _('IDまたはパスワードが違います')
    ];
  }
  $sql = "SELECT u.id as uid,u.use_start,freeend_date,u.member_id,'' as member_name, f.dir,u.exp_flg FROM userdata as u INNER JOIN ftp as f on f.id=u.id WHERE u.member_id=? AND u.del_flg='0' FOR UPDATE";
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array($POST['member_id']));
  $result = $stmt->fetch(PDO::FETCH_ASSOC);

  if ($result['exp_flg'] != '0') {
    return [
      'error' => ERR_ACCOUNT_CHECK_6,
      'error_message' => _('有効期限が切れています')
    ];
  }

//アカウント利用開始日登録
  if ($result['use_start'] == NULL) {
	  $sql = "UPDATE userdata SET use_start=CONVERT_TZ(CAST(CONVERT_TZ(now(),'UTC',tz) as date),tz,'UTC'), upd_log='account_check.php', upd_date=NOW() WHERE member_id=? and del_flg='0'";
	  $stmt = $dbh->prepare($sql);
	  $stmt->execute(array($POST['member_id']));
  }

//無料期間終了日登録
  if ($result['freeend_date'] == NULL || $result['freeend_date'] == '0000-00-00 00:00:00') {
	  $sql = "UPDATE userdata SET freeend_date=DATE_ADD(use_start,INTERVAL 31 DAY), expire_date=DATE_ADD(LAST_DAY(DATE_ADD(freeend_date,INTERVAL :expire DAY)),INTERVAL 1 DAY), upd_log='account_check.php', upd_date=NOW() WHERE member_id=:mids and del_flg='0'";
	  $stmt = $dbh->prepare($sql);
	  $stmt->execute(array(':mids' => $POST['member_id'], ':expire' => EXPIRE_DAYS_AFTER_CONTRACT));
  }

  $req = array( 'cmd' => 'mkdir', 'top' => dirname($result['dir']), 'dir' => '', 'folder' => basename($result['dir']), 'ignore' => 1 );
  $s = call_api($req);

//前回ログイン登録
  $sql = "UPDATE userdata SET last_login=now_login , now_login=NOW(), lang=?, upd_log='account_check.php', upd_date=NOW() WHERE member_id=?";
  $stmt = $dbh->prepare($sql);
  $stmt->execute(array($lang, $POST['member_id']));

  $_SESSION['usr_id'] = $result['uid'];
  $_SESSION['member_id'] = $result['member_id'];
  $_SESSION['member_name'] = $result['member_name'];
  $_SESSION['check'] = true;

  unset($_SESSION['dir']);
  unset($_SESSION['data_limit']);
  unset($_SESSION['sort']);
  unset($_SESSION['page']);

  if ($POST['login_save']) {
    $file = file_get_contents('/var/www/pk.pem');
    $pk = openssl_pkey_get_private($file);
    if ($pk) {
      $salt = bin2hex(openssl_random_pseudo_bytes(8));
      $dummy = bin2hex(openssl_random_pseudo_bytes(8));
      $work = substr($result['member_id'] . ':' . $salt . ':' . $dummy, 0, 32);
      if (openssl_sign($work, $sig, $pk)) {
        $data = base64_encode($work);
        $temp = $data . '.' . base64_encode($sig);
        $expire = mktime( 0, 0, 0, 12, 31, 2099 );
        setcookie(COOKIE_NAME, $temp, $expire, '/', '');
      } else {
        error_log('openssl: ' . openssl_error_string());
      }
    } else {
      error_log('openssl: ' . openssl_error_string());
    }
  } else {
    $expire = time() - 10;
    setcookie(COOKIE_NAME, '', $expire, '/', '');
  }
  
//error_log('[[' . $_SESSION['usr_id'] . ']]'); 
//error_log('[[' . var_export($_SESSION['usr_id'], true) . ']]'); 

  $dbh->query('COMMIT');

  $member_id = $POST['member_id'];
  include dirname(__FILE__) . '/update_info.php';

  return [
    'id' => $result['id'],
    'member_id' => $result['member_id'],
    'member_name' => $result['member_name']
  ];
}

wrap(function() {
  echo json_encode(check());
});

