dropbox_download.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * @package chamilo.dropbox
  5. */
  6. // including the basic Chamilo initialisation file
  7. //require_once '../inc/global.inc.php';
  8. // the dropbox configuration parameters
  9. require_once 'dropbox_config.inc.php';
  10. // the dropbox file that contains additional functions
  11. require_once 'dropbox_functions.inc.php';
  12. /* DOWNLOAD A FOLDER */
  13. $course_id = api_get_course_int_id();
  14. $user_id = api_get_user_id();
  15. if (isset($_GET['cat_id']) &&
  16. is_numeric($_GET['cat_id']) &&
  17. $_GET['action'] == 'downloadcategory' &&
  18. isset($_GET['sent_received'])
  19. ) {
  20. /** step 1: constructing the sql statement.
  21. Due to the nature off the classes of the dropbox the categories for sent files are stored in the table
  22. dropbox_file while the categories for the received files are stored in dropbox_post.
  23. It would have been more elegant if these could be stored in dropbox_person (which stores the link file-person)
  24. Therefore we have to create to separate sql statements to find which files are in the category
  25. (depending if we zip-download a sent category or a received category)*/
  26. if ($_GET['sent_received'] == 'sent') {
  27. // here we also incorporate the person table to make sure that deleted sent documents are not included.
  28. $sql = "SELECT DISTINCT file.id, file.filename, file.title
  29. FROM ". Database::get_course_table(TABLE_DROPBOX_FILE) ." file
  30. INNER JOIN ". Database::get_course_table(TABLE_DROPBOX_PERSON) ." person
  31. ON (person.file_id=file.id AND file.c_id = $course_id AND person.c_id = $course_id)
  32. WHERE
  33. file.uploader_id = $user_id AND
  34. file.cat_id='".intval($_GET['cat_id'])."' AND
  35. person.user_id = $user_id";
  36. }
  37. if ($_GET['sent_received'] == 'received') {
  38. $sql = "SELECT DISTINCT file.id, file.filename, file.title
  39. FROM ". Database::get_course_table(TABLE_DROPBOX_FILE) ." file
  40. INNER JOIN ". Database::get_course_table(TABLE_DROPBOX_PERSON) ." person
  41. ON (person.file_id=file.id AND file.c_id = $course_id AND person.c_id = $course_id)
  42. INNER JOIN ".Database::get_course_table(TABLE_DROPBOX_POST)." post
  43. ON (post.file_id = file.id AND post.c_id = $course_id AND file.c_id = $course_id)
  44. WHERE
  45. post.cat_id = ".intval($_GET['cat_id'])." AND
  46. post.dest_user_id = $user_id" ;
  47. }
  48. $files_to_download = array();
  49. $result = Database::query($sql);
  50. while ($row = Database::fetch_array($result)) {
  51. $files_to_download[] = $row['id'];
  52. }
  53. if (!is_array($files_to_download) || empty($files_to_download)) {
  54. header('location: index.php?view='.Security::remove_XSS($_GET['sent_received']).'&error=ErrorNoFilesInFolder');
  55. exit;
  56. }
  57. zip_download($files_to_download);
  58. exit;
  59. }
  60. /* DOWNLOAD A FILE */
  61. /* AUTHORIZATION */
  62. // Check if the id makes sense
  63. if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
  64. api_not_allowed(true);
  65. exit;
  66. }
  67. // Check if the user is allowed to download the file
  68. $allowed_to_download = false;
  69. if (user_can_download_file($_GET['id'], api_get_user_id())) {
  70. $allowed_to_download = true;
  71. }
  72. /* ERROR IF NOT ALLOWED TO DOWNLOAD */
  73. if (!$allowed_to_download) {
  74. api_not_allowed(
  75. true,
  76. Display::return_message(
  77. get_lang('YouAreNotAllowedToDownloadThisFile'),
  78. 'error'
  79. )
  80. );
  81. exit;
  82. } else {
  83. /* DOWNLOAD THE FILE */
  84. // the user is allowed to download the file
  85. $_SESSION['_seen'][$_course['id']][TOOL_DROPBOX][] = intval($_GET['id']);
  86. $work = new Dropbox_Work($_GET['id']);
  87. $path = dropbox_cnf('sysPath') . '/' . $work -> filename; //path to file as stored on server
  88. $path = api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/dropbox/' . $work -> filename; //path to file as stored on server
  89. if (!Security::check_abs_path($path, api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/dropbox/')) {
  90. exit;
  91. }
  92. $file = $work->title;
  93. $result = DocumentManager::file_send_for_download($path, true, $file);
  94. if ($result === false) {
  95. api_not_allowed(true);
  96. }
  97. exit;
  98. }
  99. //@todo clean this file the code below is useless there are 2 exits in previous conditions ... maybe a bad copy/paste/merge?
  100. exit;