exit; } } if ($do_compress) { // get metadata of attachment file $meta_func = $itemtype_name . 'GetMetaInformation'; $metadata = $meta_func($item_id); // create zip file $filename = $download->convert_to_client($filename, 'u'); $dl_filepath = download_create_zipfile($file_id, $item_id, $filename, $metadata); if ($dl_filepath === false) { download_error(500, _MD_XOONIPS_ITEM_CANNOT_CREATE_TMPFILE); } $dl_filename = $zip_filename; $dl_mimetype = 'application/x-zip'; } else { $dl_filepath = $file_handler->getFilePath($file_id); $dl_filename = $download->convert_to_client($filename, 'u'); $dl_mimetype = $xf_obj->get('mime_type'); } // record download file event log. $eventlog_handler =& xoonips_getormhandler('xoonips', 'event_log'); $eventlog_handler->recordDownloadFileEvent($item_id, $file_id); $download->download_file($dl_filepath, $dl_filename, $dl_mimetype); $download_count = $xf_obj->get('download_count'); $xf_obj->set('download_count', $download_count + 1); $xf_handler->insert($xf_obj, true); if ($dlnotify) { xoonips_notification_user_file_downloaded($file_id, $uid); } exit;
/** * execute getFile * * @param[in] $vars[0] session ID * @param[in] $vars[1] file ID * @param[in] $vars[2] agreement to license(0:not agreed, 1:agreed) * @param[out] $response->result true:success, false:failed * @param[out] $response->error error information * @param[out] $response->success XooNIpsFile file information */ function execute(&$vars, &$response) { // parameter check $error =& $response->getError(); if (count($vars) > 3) { $error->add(XNPERR_EXTRA_PARAM); } if (count($vars) < 3) { $error->add(XNPERR_MISSING_PARAM); } // if (isset($vars[0]) && strlen($vars[0]) > 32) { $error->add(XNPERR_INVALID_PARAM, 'too long parameter 1'); } if (!is_int($vars[1]) && !ctype_digit($vars[1])) { $error->add(XNPERR_INVALID_PARAM, 'not integer parameter 2'); } if ($vars[2] != '1' && $vars[2] != '0') { $error->add(XNPERR_INVALID_PARAM, 'parameter 3 must be 0 or 1'); } // if ($error->get(0)) { // return if parameter error $response->setResult(false); return false; } else { $sessionid = $vars[0]; $file_id = intval($vars[1]); $agreement = intval($vars[2]); } list($result, $uid, $session) = $this->restoreSession($sessionid); if (!$result) { $response->setResult(false); $error->add(XNPERR_INVALID_SESSION); return false; } // file_id -> file, item_id $file_handler =& xoonips_getormhandler('xoonips', 'file'); $file = $file_handler->get($file_id); if (!$file) { $response->setResult(false); $error->add(XNPERR_NOT_FOUND); return false; } $item_id = $file->get('item_id'); if (empty($item_id)) { $response->setResult(false); $error->add(XNPERR_ACCESS_FORBIDDEN); // maybe belong to other session return false; } // can user access that item? $item_handler =& xoonips_getormcompohandler('xoonips', 'item'); if (!$item_handler->getPerm($item_id, $uid, 'read')) { $response->setResult(false); $error->add(XNPERR_ACCESS_FORBIDDEN); return false; } // already deleted? if ($file->get('is_deleted')) { $response->setResult(false); $error->add(XNPERR_NOT_FOUND, "already deleted or replaced"); return false; } // item_id -> item, itemtype $item_basic_handler =& xoonips_getormhandler('xoonips', 'item_basic'); $basic = $item_basic_handler->get($item_id); if (!$basic) { $response->setResult(false); $error->add(XNPERR_SERVER_ERROR, "cannot get item_basic"); return false; } $item_type_handler =& xoonips_getormhandler('xoonips', 'item_type'); $item_type = $item_type_handler->get($basic->get('item_type_id')); if (!$item_type) { $response->setResult(false); $error->add(XNPERR_SERVER_ERROR, "cannot get itemtype of that item"); return false; } // item_type, item_id -> detail $detail_item_handler =& xoonips_getormcompohandler($item_type->get('name'), 'item'); $detail_item = $detail_item_handler->get($item_id); if (!$detail_item) { $response->setResult(false); $error->add(XNPERR_SERVER_ERROR, "cannot get item"); return false; } $detail = $detail_item->getVar('detail'); // license agreement? if (!$agreement && $detail->get('rights')) { $response->setResult(false); $error->add(XNPERR_ERROR, "need license agreement"); return false; } if (!$detail_item_handler->hasDownloadPermission($uid, $file_id)) { $response->setResult(false); $error->add(XNPERR_ACCESS_FORBIDDEN); return false; } // start transaction $transaction = XooNIpsTransaction::getInstance(); $transaction->start(); // increment download count $file->setVar('download_count', $file->get('download_count') + 1, true); if (!$file_handler->insert($file)) { $transaction->rollback(); $response->setResult(false); $error->add(XNPERR_SERVER_ERROR, "cannot update file table"); return false; } // insert event log ( file downloaded ) $eventlog_handler =& xoonips_getormhandler('xoonips', 'event_log'); if (!$eventlog_handler->recordDownloadFileEvent($item_id, $file_id)) { $transaction->rollback(); $response->setResult(false); $error->add(XNPERR_SERVER_ERROR, "cannot insert event log"); return false; } // get module option 'enable_dl_limit' $iteminfo = $detail_item_handler->getIteminfo(); $mhandler =& xoops_gethandler('module'); $module = $mhandler->getByDirname($iteminfo['ormcompo']['module']); $chandler =& xoops_gethandler('config'); $assoc = $chandler->getConfigsByCat(false, $module->mid()); if (isset($assoc['enable_dl_limit']) && $assoc['enable_dl_limit'] == '1') { // send download-notification if ($detail->get('attachment_dl_limit') && $detail->get('attachment_dl_notify')) { xoonips_notification_user_file_downloaded($file_id, $uid); } } // end transaction $transaction->commit(); $response->setSuccess($file); $response->setResult(true); return true; }