<?php

include dirname(__FILE__) . '/session.php';
include dirname(__FILE__) . '/dbconfig.php';
include dirname(__FILE__) . '/utils.php';

function check() {
check_session();

$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);

$sql = "SELECT ftp.* FROM userdata as u INNER JOIN ftp ON ftp.id=u.id AND ftp.del_flg='0' WHERE u.id=? AND u.del_flg='0'";
$stmt = $dbh->prepare($sql);
$stmt->execute(array($_SESSION['usr_id']));

$account = $stmt->fetch(PDO::FETCH_ASSOC);

$top = $account['dir'];
if (empty($top)) {
  $top = '/var/www/html';
}

if (preg_match('/([0-9]*)\/(.*)$/',trim($_SERVER['PATH_INFO'],'/'),$m)){
  $inode = $m[1];
  $pname = trim($m[2],'/');
}
$dir   = $_SESSION['dir'];
if (!empty($dir)) {
  $dir = '/' . $dir;
}

$folder = '';
if (isset($_GET['folder'])){
    $folder = $_GET['folder'];
}

$req = array( 'cmd' => 'name', 'top' => $top, 'dir' => $dir, 'inode' => $inode, 'folder' => $folder );
$contents = call_api($req);

$result = json_decode($contents,true);

$path = $result['path'];
$name = basename($path);

if ($name != urldecode($pname)) {
  echo json_encode(array('error' => _('ファイルをダウンロードできません。リロードしてやりなおしてください')));
  exit(0);
}

$tz = 'UTC';
if (isset($_SESSION['tzoff'])) {
  $of = intval($_SESSION['tzoff']);
  $sign = '+';
  if ($of < 0) {
    $sign = '-';
    $of   = -$of;
  }
  $hour = intval($of/60);
  $min  = $of-$hour*60;
  $tz = sprintf('GMT%s%02d:%02d',$sign,$hour,$min);
}

include dirname(__FILE__) . '/nocache.php';

if (file_exists($path)) {
  $top = rtrim($top, '/');
  $lock_inodes = array();
  $lock_files  = array();
  $p = popen("find $top$dir/$name -printf \"%i %p\n\"", "r");
  while(($line = fgets($p)) !== false) {
    if (preg_match("/^([0-9]+) (.*)$/", $line, $m)) {
      $lock_inodes[] = $m[1];
      $lock_files[]  = str_replace($top,'',realpath($m[2]));
    }
  }
  pclose($p);
  $top .= '/';
  with_lock($top, $lock_inodes, $lock_files, '0', function() use($dbh, $name, $top, $dir,$tz,$lock_inodes,$lock_files) {
     $files = array("./$name");

     $pass  = bin2hex(openssl_random_pseudo_bytes(8));

     $params = json_encode(array(
       'name'   => $name . '.zip',
#       'cmd'    => "cd '$top$dir'; cat $temp | TZ='$tz' zip -r -J -@ - ",
       'top'    => $top,
       'path'   => $top . $dir,
       'tz'     => $tz,
       'files'  => $files,
       'pass'   => $pass,
       'lock'   => array('inodes' => $lock_inodes, 'files' => $lock_files)
     ));

     $sql  = "INSERT INTO download (params) VALUES (?)";
     $stmt = $dbh->prepare($sql);
     $stmt->execute(array($params));
     $stmt = $dbh->prepare("SELECT LAST_INSERT_ID() as id");
     $stmt->execute();
     $row = $stmt->fetch(PDO::FETCH_ASSOC);
     $id  = $row['id'];

     setcookie('GRMONEDL', $pass, 0, '/');

     echo json_encode(array('url' => '/cgi-bin/downloadZip.cgi/' . $id . '/' . $name . '.zip'));
  },function() {
     echo json_encode(array('error' => _('アップロード中のファイルが含まれるためダウンロードできません。')));
  });
} else {
  echo json_encode(array('error' => _('ファイルをダウンロードできません。リロードしてやりなおしてください')));
}

}

wrap('check');
