Project

General

Profile

1
<?php
2
/*
3
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
4
 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
5
 *
6
 * == BEGIN LICENSE ==
7
 *
8
 * Licensed under the terms of any of the following licenses at your
9
 * choice:
10
 *
11
 *  - GNU General Public License Version 2 or later (the "GPL")
12
 *    http://www.gnu.org/licenses/gpl.html
13
 *
14
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
15
 *    http://www.gnu.org/licenses/lgpl.html
16
 *
17
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
18
 *    http://www.mozilla.org/MPL/MPL-1.1.html
19
 *
20
 * == END LICENSE ==
21
 *
22
 * Utility functions for the File Manager Connector for PHP.
23
 */
24

    
25
function RemoveFromStart( $sourceString, $charToRemove )
26
{
27
	$sPattern = '|^' . $charToRemove . '+|' ;
28
	return preg_replace( $sPattern, '', $sourceString ) ;
29
}
30

    
31
function RemoveFromEnd( $sourceString, $charToRemove )
32
{
33
	$sPattern = '|' . $charToRemove . '+$|' ;
34
	return preg_replace( $sPattern, '', $sourceString ) ;
35
}
36

    
37
function FindBadUtf8( $string )
38
{
39
	$regex =
40
	'([\x00-\x7F]'.
41
	'|[\xC2-\xDF][\x80-\xBF]'.
42
	'|\xE0[\xA0-\xBF][\x80-\xBF]'.
43
	'|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.
44
	'|\xED[\x80-\x9F][\x80-\xBF]'.
45
	'|\xF0[\x90-\xBF][\x80-\xBF]{2}'.
46
	'|[\xF1-\xF3][\x80-\xBF]{3}'.
47
	'|\xF4[\x80-\x8F][\x80-\xBF]{2}'.
48
	'|(.{1}))';
49

    
50
	while (preg_match('/'.$regex.'/S', $string, $matches)) {
51
		if ( isset($matches[2])) {
52
			return true;
53
		}
54
		$string = substr($string, strlen($matches[0]));
55
	}
56

    
57
	return false;
58
}
59

    
60
function ConvertToXmlAttribute( $value )
61
{
62
	if ( defined( 'PHP_OS' ) )
63
	{
64
		$os = PHP_OS ;
65
	}
66
	else
67
	{
68
		$os = php_uname() ;
69
	}
70

    
71
	if ( strtoupper( substr( $os, 0, 3 ) ) === 'WIN' || FindBadUtf8( $value ) )
72
	{
73
		return ( utf8_encode( htmlspecialchars( $value ) ) ) ;
74
	}
75
	else
76
	{
77
		return ( htmlspecialchars( $value ) ) ;
78
	}
79
}
80

    
81
/**
82
 * Check whether given extension is in html etensions list
83
 *
84
 * @param string $ext
85
 * @param array $htmlExtensions
86
 * @return boolean
87
 */
88
function IsHtmlExtension( $ext, $htmlExtensions )
89
{
90
	if ( !$htmlExtensions || !is_array( $htmlExtensions ) )
91
	{
92
		return false ;
93
	}
94
	$lcaseHtmlExtensions = array() ;
95
	foreach ( $htmlExtensions as $key => $val )
96
	{
97
		$lcaseHtmlExtensions[$key] = strtolower( $val ) ;
98
	}
99
	return in_array( $ext, $lcaseHtmlExtensions ) ;
100
}
101

    
102
/**
103
 * Detect HTML in the first KB to prevent against potential security issue with
104
 * IE/Safari/Opera file type auto detection bug.
105
 * Returns true if file contain insecure HTML code at the beginning.
106
 *
107
 * @param string $filePath absolute path to file
108
 * @return boolean
109
 */
110
function DetectHtml( $filePath )
111
{
112
	$fp = @fopen( $filePath, 'rb' ) ;
113

    
114
	//open_basedir restriction, see #1906
115
	if ( $fp === false || !flock( $fp, LOCK_SH ) )
116
	{
117
		return -1 ;
118
	}
119

    
120
	$chunk = fread( $fp, 1024 ) ;
121
	flock( $fp, LOCK_UN ) ;
122
	fclose( $fp ) ;
123

    
124
	$chunk = strtolower( $chunk ) ;
125

    
126
	if (!$chunk)
127
	{
128
		return false ;
129
	}
130

    
131
	$chunk = trim( $chunk ) ;
132

    
133
	if ( preg_match( "/<!DOCTYPE\W*X?HTML/sim", $chunk ) )
134
	{
135
		return true;
136
	}
137

    
138
	$tags = array( '<body', '<head', '<html', '<img', '<pre', '<script', '<table', '<title' ) ;
139

    
140
	foreach( $tags as $tag )
141
	{
142
		if( false !== strpos( $chunk, $tag ) )
143
		{
144
			return true ;
145
		}
146
	}
147

    
148
	//type = javascript
149
	if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) )
150
	{
151
		return true ;
152
	}
153

    
154
	//href = javascript
155
	//src = javascript
156
	//data = javascript
157
	if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) )
158
	{
159
		return true ;
160
	}
161

    
162
	//url(javascript
163
	if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) )
164
	{
165
		return true ;
166
	}
167

    
168
	return false ;
169
}
170

    
171
/**
172
 * Check file content.
173
 * Currently this function validates only image files.
174
 * Returns false if file is invalid.
175
 *
176
 * @param string $filePath absolute path to file
177
 * @param string $extension file extension
178
 * @param integer $detectionLevel 0 = none, 1 = use getimagesize for images, 2 = use DetectHtml for images
179
 * @return boolean
180
 */
181
function IsImageValid( $filePath, $extension )
182
{
183
	if (!@is_readable($filePath)) {
184
		return -1;
185
	}
186

    
187
	$imageCheckExtensions = array('gif', 'jpeg', 'jpg', 'png', 'swf', 'psd', 'bmp', 'iff');
188

    
189
	// version_compare is available since PHP4 >= 4.0.7
190
	if ( function_exists( 'version_compare' ) ) {
191
		$sCurrentVersion = phpversion();
192
		if ( version_compare( $sCurrentVersion, "4.2.0" ) >= 0 ) {
193
			$imageCheckExtensions[] = "tiff";
194
			$imageCheckExtensions[] = "tif";
195
		}
196
		if ( version_compare( $sCurrentVersion, "4.3.0" ) >= 0 ) {
197
			$imageCheckExtensions[] = "swc";
198
		}
199
		if ( version_compare( $sCurrentVersion, "4.3.2" ) >= 0 ) {
200
			$imageCheckExtensions[] = "jpc";
201
			$imageCheckExtensions[] = "jp2";
202
			$imageCheckExtensions[] = "jpx";
203
			$imageCheckExtensions[] = "jb2";
204
			$imageCheckExtensions[] = "xbm";
205
			$imageCheckExtensions[] = "wbmp";
206
		}
207
	}
208

    
209
	if ( !in_array( $extension, $imageCheckExtensions ) ) {
210
		return true;
211
	}
212

    
213
	if ( @getimagesize( $filePath ) === false ) {
214
		return false ;
215
	}
216

    
217
	return true;
218
}
219

    
220
?>
(10-10/10)