<?php

define('COOKIE_NAME', 'GRMONE_lZj3AwlX');
define('CSRF_COOKIE', 'GRMONE_dTkD4cNh');
define('HMAC_KEY', 'GxCrNGPO');

define('SOCKET_FILE', '/var/www/getfiles.sock');

$LANG_MAP = array(
  'ja' => 'ja_JP',
  'en' => 'en_US'
);

define('GB', 1024*1024*1024);
define('MB', 1024*1024);
define('KB', 1024);

function sessionCheck() {
  if (isset($_SESSION['usr_id'])) {
    $temp1 = bin2hex(openssl_random_pseudo_bytes(8));
    $temp2 = bin2hex(openssl_random_pseudo_bytes(8));
    $hmac = hash_hmac('sha256', $temp1 . $temp2, HMAC_KEY );
    $_SESSION['csrf'] = $temp1;
    setcookie(CSRF_COOKIE, $hmac . '.' . $temp2, 0, '/', '');
    return;
  }
  $_SESSION['nosession'] = 1;
  session_commit();
  header('Location: index.php');
  exit(0);
}

function logout() {
  if (isset($_SESSION['usr_id'])) {
    unset($_SESSION['usr_id']);
    session_commit();
  }
  header('Location: index.php');
  exit(0);
}

function convUseData($use_data) {
  if ($use_data >= GB) {
    return sprintf('%4.2f GB',$use_data/GB);
  }
  if ($use_data >= MB) {
    return sprintf('%4.2f MB',$use_data/MB);
  }
  if ($use_data >= KB) {
    return sprintf('%4.2f KB',$use_data/KB);
  }
  return sprintf('%d B',$use_data);
}

function calcCapPercent($user_data) {
  $use = intval($user_data['use_data'] / KB);
  $cap = intval($user_data['capacity_gb']);
  if (!$cap) {
    $cap = 1;
  }
  return intval($use * 100 / ($cap * MB));
}

function setTextDomain($domain) {
  $lang = getCurrentLang();
  setlocale(LC_ALL, $lang);
  bind_textdomain_codeset($domain, 'UTF-8');
  bindtextdomain($domain, dirname(__FILE__) . '/../locale/');
  textdomain($domain);
  return $lang;
}

function getCurrentLang() {
  global $LANG_MAP;
  if (preg_match("'^/en/'",$_SERVER['REQUEST_URI'])) {
    $_SESSION['lang'] = 'en_US';
    return 'en_US';
  }
  if (preg_match("'^/jp/'",$_SERVER['REQUEST_URI'])) {
    $_SESSION['lang'] = 'ja_JP';
    return 'ja_JP';
  }
  if (isset($_SESSION['lang']) && !empty($_SESSION['lang'])) {
    return $_SESSION['lang'];
  } else {
    if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
      return 'ja_JP';
    }
    $http_accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $list = explode(',', $http_accept_language);
    $langs = array();
    foreach( $list as $item ) {
      if (preg_match('/^([^;]*);q=(.*)$/',$item,$m)) {
        $langs[] = array($m[1], floatval($m[2]));
      } else {
        $langs[] = array($item, 1.0);
      }
    }
    usort($langs, function($a,$b) { return $b[1] - $a[1]; });
    foreach ($langs as $lang) {
      if (isset($LANG_MAP[$lang[0]])) {
        return $LANG_MAP[$lang[0]];
      }
    }
    return 'ja_JP';
  }
}

function changeLanguage($lang) {
  $_SESSION['lang'] = $lang;
  $prefix = '';
  if (preg_match("'^/(jp|en)/'", $_SERVER['REQUEST_URI'])) {
    if ($lang == 'ja_JP') {
      $prefix = '/jp/';
    } else {
      $prefix = '/en/';
    }
  }
  $ext='';
  if (preg_match('/\/index(.*)\.php/',$_SERVER['SCRIPT_NAME'],$m)){
      $ext = $m[1];
  }
  header("Location: ${prefix}index${ext}.php");
  session_commit();
  exit(0);
}
function changeLanguagePass($lang) {
  $_SESSION['lang'] = $lang;
  header('Location: passwdChange.php');
  session_commit();
  exit(0);
}

function setTimezone($dbh) {
  $tz = 'UTC';
  if (isset($_SESSION['tzoff'])) {
    $sign = '+';
    $off  =  - intval($_SESSION['tzoff']);
    if ($off < 0 ) {
      $sign = '-';
      $off  = -$off;
    }
    $hour = intval($off / 60);
    $min  = $off - $hour * 60;
    $tz = sprintf('%s%02d:%02d',$sign,$hour,$min);
//    $dbh->query("set time_zone = '$tz';");
  }
  $dbh->query("SET @time_zone='$tz';");
  return $tz;
}

function check_session()
{
  if (isset($_SESSION['usr_id'])) {
    if (isset($_COOKIE[CSRF_COOKIE]) && isset($_SESSION['csrf'])) {
      $temp = explode('.', $_COOKIE[CSRF_COOKIE]);
      $hmac = hash_hmac('sha256', $_SESSION['csrf'] . $temp[1], HMAC_KEY);
      if ($hmac == $temp[0]) {
        return;
      }
    }
  }
  $_SESSION['nosession'] = true;
  session_commit();
  echo json_encode(array('error'=>'no session'));
  exit(0);
}

function wrap($func) {
  try {
    call_user_func($func);
  }
  catch( Throwable $e ) {
    error_log("error : " . $e->getMessage());
    $out = array(
      'error' => true,
      'error_message' => 'system error'
    );
    echo json_encode($out);
  }
}

function _call_api($req) {
  $s = stream_socket_client('unix://' . SOCKET_FILE, $errno, $errstr);
  $param = json_encode($req);
  $data = sprintf("%-11d ",strlen($param)) . $param;
//  error_log('data : ' . $data);
  fwrite($s, $data);
  $contents = stream_get_contents($s);
  fclose($s);
  return $contents;
}

function call_api($req) {
  $param = json_encode($req);
  $cmd = "LANG=ja_JP.utf-8 /var/www/html/bin/getfiles.sh ".bin2hex($param);
  $fp = popen($cmd, "r");
  $contents = stream_get_contents($fp);
  pclose($fp);
  return $contents;
}

$lockStream = null;
$lockId = 0;

function lock_command($s, $param)
{
  $data  = sprintf("%-9d %s", strlen($param), $param);
  fwrite($s, $data);
$fp=fopen('/var/www/out','w');
fwrite($fp,$data);
fclose($fp);
  $len = fread($s, 10);
  $res = fread($s, intval(trim($len)));
  return $res;
}

function open_lock() {
  global $lockStream;
  global $lockId;
  if (!is_null($lockStream)) {
    return $lockStream;
  }
  $lockStream = stream_socket_client("tcp://localhost:12345", $errno, $errstr);
  if (!$lockStream) {
    error_log("open_lock: " . $errstr);
    exit(0);
  }
  $param  = sprintf("c:%d:1", $lockId);
  $res    = lock_command($lockStream, $param);
  $lockId = intval(trim($res));

  return $lockStream;
}

function call_lock($req) {
  $s = open_lock();
  $param = sprintf("+:%s/:%s:%d:%s",rtrim($req['top'],'/'),$req['inode'],$req['type'],$req['file']);
  $res   = lock_command($s, $param);
  $val   = explode(' ',trim($res));
  if ($val[0] == 0) {
    return intval($val[1]);
  }
  return false;
}

function call_unlock($req) {
  $s = open_lock();
  $param = sprintf("-:%s/:0:%d",rtrim($req['top'],'/'),$req['lock']);
  $res   = lock_command($s, $param);
}

function with_lock($top, $inodes, $files, $type, $proc, $errfunc) {
  $lock = call_lock(array('top'=>$top,'inode'=>implode(',',$inodes),'type'=>$type,'file'=>implode('|',$files)));
  if ($lock !== false) {
    try {
      call_user_func($proc);
    } catch(Exception $e) {
      throw $e;
    } finally {
      call_unlock(array('top'=>$top,'lock'=>$lock));
    }
  } else {
    call_user_func($errfunc);
  }
}

function getBaseUrl() {
    $port = $_SERVER['SERVER_PORT'];
    if ($port == '80') {
        return $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . '/';
    } else {
        return $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . ':' . $port . '/';
    }
}
