1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
<?php
class WPCF7_SWV_FileRule extends WPCF7_SWV_Rule {
const rule_name = 'file';
public function matches( $context ) { if ( false === parent::matches( $context ) ) { return false; }
if ( empty( $context['file'] ) ) { return false; }
return true; }
public function validate( $context ) { $field = $this->get_property( 'field' ); $input = isset( $_FILES[$field]['name'] ) ? $_FILES[$field]['name'] : ''; $input = wpcf7_array_flatten( $input ); $input = wpcf7_exclude_blank( $input );
$acceptable_filetypes = array();
foreach ( (array) $this->get_property( 'accept' ) as $accept ) { if ( false === strpos( $accept, '/' ) ) { $acceptable_filetypes[] = strtolower( $accept ); } else { foreach ( wpcf7_convert_mime_to_ext( $accept ) as $ext ) { $acceptable_filetypes[] = sprintf( '.%s', strtolower( trim( $ext, ' .' ) ) ); } } }
$acceptable_filetypes = array_unique( $acceptable_filetypes );
foreach ( $input as $i ) { $last_period_pos = strrpos( $i, '.' );
if ( false === $last_period_pos ) { // no period return new WP_Error( 'wpcf7_invalid_file', $this->get_property( 'error' ) ); }
$suffix = strtolower( substr( $i, $last_period_pos ) );
if ( ! in_array( $suffix, $acceptable_filetypes, true ) ) { return new WP_Error( 'wpcf7_invalid_file', $this->get_property( 'error' ) ); } }
return true; }
public function to_array() { return array( 'rule' => self::rule_name ) + (array) $this->properties; } }
|