PageRenderTime 29ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/contact-form-7/modules/file.php

https://github.com/airhorns/Skylight-Labs
PHP | 237 lines | 158 code | 66 blank | 13 comment | 44 complexity | f43943bdd628804648ac0e54a89131ed MD5 | raw file
  1. <?php
  2. /**
  3. ** A base module for [file] and [file*]
  4. **/
  5. /* Shortcode handler */
  6. wpcf7_add_shortcode( 'file', 'wpcf7_file_shortcode_handler', true );
  7. wpcf7_add_shortcode( 'file*', 'wpcf7_file_shortcode_handler', true );
  8. function wpcf7_file_shortcode_handler( $tag ) {
  9. global $wpcf7_contact_form;
  10. if ( ! is_array( $tag ) )
  11. return '';
  12. $type = $tag['type'];
  13. $name = $tag['name'];
  14. $options = (array) $tag['options'];
  15. $values = (array) $tag['values'];
  16. if ( empty( $name ) )
  17. return '';
  18. $atts = '';
  19. $id_att = '';
  20. $class_att = '';
  21. if ( 'file*' == $type )
  22. $class_att .= ' wpcf7-validates-as-required';
  23. foreach ( $options as $option ) {
  24. if ( preg_match( '%^id:([-0-9a-zA-Z_]+)$%', $option, $matches ) ) {
  25. $id_att = $matches[1];
  26. } elseif ( preg_match( '%^class:([-0-9a-zA-Z_]+)$%', $option, $matches ) ) {
  27. $class_att .= ' ' . $matches[1];
  28. }
  29. }
  30. if ( $id_att )
  31. $atts .= ' id="' . trim( $id_att ) . '"';
  32. if ( $class_att )
  33. $atts .= ' class="' . trim( $class_att ) . '"';
  34. $html = '<input type="file" name="' . $name . '"' . $atts . ' value="1" />';
  35. $validation_error = '';
  36. if ( is_a( $wpcf7_contact_form, 'WPCF7_ContactForm' ) )
  37. $validation_error = $wpcf7_contact_form->validation_error( $name );
  38. $html = '<span class="wpcf7-form-control-wrap ' . $name . '">' . $html . $validation_error . '</span>';
  39. return $html;
  40. }
  41. /* Encode type filter */
  42. add_filter( 'wpcf7_form_enctype', 'wpcf7_file_form_enctype_filter' );
  43. function wpcf7_file_form_enctype_filter( $enctype ) {
  44. global $wpcf7_contact_form;
  45. $multipart = (bool) $wpcf7_contact_form->form_scan_shortcode(
  46. array( 'type' => array( 'file', 'file*' ) ) );
  47. if ( $multipart )
  48. $enctype = ' enctype="multipart/form-data"';
  49. return $enctype;
  50. }
  51. /* Validation + upload handling filter */
  52. add_filter( 'wpcf7_validate_file', 'wpcf7_file_validation_filter', 10, 2 );
  53. add_filter( 'wpcf7_validate_file*', 'wpcf7_file_validation_filter', 10, 2 );
  54. function wpcf7_file_validation_filter( $result, $tag ) {
  55. global $wpcf7_contact_form;
  56. $type = $tag['type'];
  57. $name = $tag['name'];
  58. $options = (array) $tag['options'];
  59. $file = $_FILES[$name];
  60. if ( $file['error'] && UPLOAD_ERR_NO_FILE != $file['error'] ) {
  61. $result['valid'] = false;
  62. $result['reason'][$name] = $wpcf7_contact_form->message( 'upload_failed_php_error' );
  63. return $result;
  64. }
  65. if ( empty( $file['tmp_name'] ) && 'file*' == $type ) {
  66. $result['valid'] = false;
  67. $result['reason'][$name] = $wpcf7_contact_form->message( 'invalid_required' );
  68. return $result;
  69. }
  70. if ( ! is_uploaded_file( $file['tmp_name'] ) )
  71. return $result;
  72. $file_type_pattern = '';
  73. $allowed_size = 1048576; // default size 1 MB
  74. foreach ( $options as $option ) {
  75. if ( preg_match( '%^filetypes:(.+)$%', $option, $matches ) ) {
  76. $file_types = explode( '|', $matches[1] );
  77. foreach ( $file_types as $file_type ) {
  78. $file_type = trim( $file_type, '.' );
  79. $file_type = str_replace(
  80. array( '.', '+', '*', '?' ), array( '\.', '\+', '\*', '\?' ), $file_type );
  81. $file_type_pattern .= '|' . $file_type;
  82. }
  83. } elseif ( preg_match( '/^limit:([1-9][0-9]*)([kKmM]?[bB])?$/', $option, $matches ) ) {
  84. $allowed_size = (int) $matches[1];
  85. $kbmb = strtolower( $matches[2] );
  86. if ( 'kb' == $kbmb ) {
  87. $allowed_size *= 1024;
  88. } elseif ( 'mb' == $kbmb ) {
  89. $allowed_size *= 1024 * 1024;
  90. }
  91. }
  92. }
  93. /* File type validation */
  94. // Default file-type restriction
  95. if ( '' == $file_type_pattern )
  96. $file_type_pattern = 'jpg|jpeg|png|gif|pdf|doc|docx|ppt|pptx|odt|avi|ogg|m4a|mov|mp3|mp4|mpg|wav|wmv';
  97. $file_type_pattern = trim( $file_type_pattern, '|' );
  98. $file_type_pattern = '(' . $file_type_pattern . ')';
  99. $file_type_pattern = '/\.' . $file_type_pattern . '$/i';
  100. if ( ! preg_match( $file_type_pattern, $file['name'] ) ) {
  101. $result['valid'] = false;
  102. $result['reason'][$name] = $wpcf7_contact_form->message( 'upload_file_type_invalid' );
  103. return $result;
  104. }
  105. /* File size validation */
  106. if ( $file['size'] > $allowed_size ) {
  107. $result['valid'] = false;
  108. $result['reason'][$name] = $wpcf7_contact_form->message( 'upload_file_too_large' );
  109. return $result;
  110. }
  111. $uploads_dir = wpcf7_upload_tmp_dir();
  112. wpcf7_init_uploads(); // Confirm upload dir
  113. $filename = $file['name'];
  114. // If you get script file, it's a danger. Make it TXT file.
  115. if ( preg_match( '/\.(php|pl|py|rb|cgi)\d?$/', $filename ) )
  116. $filename .= '.txt';
  117. // foo.php.jpg => foo.php_.jpg
  118. $filename = wpcf7_sanitize_file_name( $filename );
  119. $filename = wp_unique_filename( $uploads_dir, $filename );
  120. $new_file = trailingslashit( $uploads_dir ) . $filename;
  121. if ( false === @move_uploaded_file( $file['tmp_name'], $new_file ) ) {
  122. $result['valid'] = false;
  123. $result['reason'][$name] = $wpcf7_contact_form->message( 'upload_failed' );
  124. return $result;
  125. }
  126. // Make sure the uploaded file is only readable for the owner process
  127. @chmod( $new_file, 0400 );
  128. $wpcf7_contact_form->uploaded_files[$name] = $new_file;
  129. return $result;
  130. }
  131. /* File uploading functions */
  132. function wpcf7_init_uploads() {
  133. $dir = wpcf7_upload_tmp_dir();
  134. wp_mkdir_p( trailingslashit( $dir ) );
  135. @chmod( $dir, 0733 );
  136. $htaccess_file = trailingslashit( $dir ) . '.htaccess';
  137. if ( file_exists( $htaccess_file ) )
  138. return;
  139. if ( $handle = @fopen( $htaccess_file, 'w' ) ) {
  140. fwrite( $handle, "Deny from all\n" );
  141. fclose( $handle );
  142. }
  143. }
  144. function wpcf7_upload_tmp_dir() {
  145. if ( defined( 'WPCF7_UPLOADS_TMP_DIR' ) )
  146. return WPCF7_UPLOADS_TMP_DIR;
  147. else
  148. return wpcf7_upload_dir( 'dir' ) . '/wpcf7_uploads';
  149. }
  150. function wpcf7_cleanup_upload_files() {
  151. $dir = trailingslashit( wpcf7_upload_tmp_dir() );
  152. if ( ! is_dir( $dir ) )
  153. return false;
  154. if ( ! is_readable( $dir ) )
  155. return false;
  156. if ( ! is_writable( $dir ) )
  157. return false;
  158. if ( $handle = @opendir( $dir ) ) {
  159. while ( false !== ( $file = readdir( $handle ) ) ) {
  160. if ( $file == "." || $file == ".." || $file == ".htaccess" )
  161. continue;
  162. $stat = stat( $dir . $file );
  163. if ( $stat['mtime'] + 60 < time() ) // 60 secs
  164. @unlink( $dir . $file );
  165. }
  166. closedir( $handle );
  167. }
  168. }
  169. if ( ! is_admin() && 'GET' == $_SERVER['REQUEST_METHOD'] )
  170. wpcf7_cleanup_upload_files();
  171. ?>