#338923 Improve description of security setting
[project/fckeditor.git] / fckeditor.lib.inc
CommitLineData
1b120ffb 1<?php
f60bb09c
JS
2// $Id$
3/**
4 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
5 * Copyright (C) 2003-2008 Frederico Caldeira Knabben
6 *
7 * == BEGIN LICENSE ==
8 *
9 * Licensed under the terms of any of the following licenses at your
10 * choice:
11 *
12 * - GNU General Public License Version 2 or later (the "GPL")
13 * http://www.gnu.org/licenses/gpl.html
14 *
15 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
16 * http://www.gnu.org/licenses/lgpl.html
17 *
18 * - Mozilla Public License Version 1.1 or later (the "MPL")
19 * http://www.mozilla.org/MPL/MPL-1.1.html
20 *
21 * == END LICENSE ==
22 *
23 * @file
24 * FCKeditor Module for Drupal 6.x
25 *
26 * This module allows Drupal to replace textarea fields with FCKeditor.
27 *
28 * This HTML text editor brings to the web many of the powerful functionalities
29 * of known desktop editors like Word. It's really lightweight and doesn't
30 * require any kind of installation on the client computer.
31 */
29d8625e
WW
32
33/**
34 * Guess the absolute server path to the document root
35 * Usually it should return $_SERVER['DOCUMENT_ROOT']
36 *
37 * @todo Improve me!!
38 * Returns absolute path or false on failure
af8e9eeb 39 *
29d8625e
WW
40 * @return string|boolean
41 */
42function fckeditor_get_document_root_full_path() {
43 $found=0;
44 $index_dir = realpath(dirname($_SERVER['SCRIPT_FILENAME'])); // {/dir1/dir2/home/drupal}/index.php
f60bb09c
JS
45 if (getcwd() == $index_dir) {
46 $found++;
47 }
29d8625e
WW
48 $drupal_dir = base_path();
49 $index_dir = str_replace('\\', "/", $index_dir);
50 $drupal_dir = str_replace('\\', "/", $drupal_dir);
51 $document_root_dir = $index_dir .'/'. str_repeat('../', substr_count($drupal_dir, '/')-1);
52 $document_root_dir = realpath($document_root_dir);
53 $document_root_dir = rtrim($document_root_dir, '/\\');
f60bb09c
JS
54 if ($document_root_dir == $_SERVER['DOCUMENT_ROOT']) {
55 $found++;
56 }
29d8625e
WW
57 $document_root_dir = str_replace('\\', '/', $document_root_dir);
58
f60bb09c
JS
59 if ($document_root_dir != '') {
60 $found++;
61 }
62 if (file_exists($document_root_dir)) {
63 $found++;
64 }
65 if (file_exists($document_root_dir . base_path() .'includes/bootstrap.inc')) {
66 $found++;
67 }
29d8625e
WW
68
69 if ($found >= 3) {
70 return $document_root_dir;
71 }
72 else{
73 return FALSE;
74 }
75}
76
77/**
78 * Emulates the asp Server.mapPath function.
79 * Given an url path return the physical directory that it corresponds to.
80 *
81 * Returns absolute path or false on failure
af8e9eeb 82 *
29d8625e
WW
83 * @param string $path
84 * @return @return string|boolean
85 */
f60bb09c
JS
86function fckeditor_resolve_url($path) {
87 if (function_exists('apache_lookup_uri')) {
88 $info = @apache_lookup_uri($path);
29d8625e
WW
89 if (!$info) {
90 return FALSE;
91 }
92 return $info->filename . $info->path_info ;
93 }
94
95 $document_root = fckeditor_get_document_root_full_path();
f60bb09c 96 if ($document_root !== FALSE) {
29d8625e
WW
97 return $document_root . $path;
98 }
af8e9eeb 99
29d8625e
WW
100 return FALSE;
101}
102
1b120ffb
JS
103function fckeditor_load_toolbar_options() {
104 $arr = array();
105 $module_drupal_path = drupal_get_path('module', 'fckeditor');
29d8625e
WW
106 $editor_local_path = fckeditor_path(TRUE);
107 $fckconfig_js = $editor_local_path .'/fckconfig.js';
1b120ffb
JS
108 $fckeditor_config_js = $module_drupal_path .'/fckeditor.config.js';
109 if (file_exists($fckconfig_js) && is_readable($fckconfig_js)) {
110 $fp = @fopen($fckconfig_js, "r");
111 if ($fp) {
112 while (!feof($fp)) {
113 $line = fgets($fp, 1024);
114 $matches = array();
115 if (preg_match('/FCKConfig\.ToolbarSets\[("|\')(.*?)\\1\]/i', $line, $matches)) {
af8e9eeb 116 $arr[$matches[2]] = drupal_ucfirst($matches[2]);
1b120ffb
JS
117 }
118 }
119 fclose($fp);
120 }
121 }
122 if (file_exists($fckeditor_config_js) && is_readable($fckeditor_config_js)) {
123 $fp = @fopen($fckeditor_config_js, "r");
124 if ($fp) {
125 while (!feof($fp)) {
126 $line = fgets($fp, 1024);
127 $matches = array();
128 if (preg_match('/FCKConfig\.ToolbarSets\[("|\')(.*?)\\1\]/i', $line, $matches)) {
af8e9eeb 129 $arr[$matches[2]] = drupal_ucfirst($matches[2]);
1b120ffb
JS
130 }
131 }
132 fclose($fp);
133 }
134 }
135
136 //oops, we have no information about toolbars, let's use hardcoded array
137 if (empty($arr)) {
138 $arr = array(
201b993d 139 'Basic' => 'Basic',
140 'Default' => 'Default',
1b120ffb
JS
141 );
142 }
143 asort($arr);
144
145 return $arr;
146}
147
148function fckeditor_load_skin_options() {
149 $arr = array();
29d8625e
WW
150 $editor_local_path = fckeditor_path(TRUE);
151 $skin_dir = $editor_local_path .'/editor/skins';
1b120ffb
JS
152 if (is_dir($skin_dir)) {
153 $dh = @opendir($skin_dir);
154 if (FALSE !== $dh) {
155 while (($file = readdir($dh)) !== FALSE ) {
156 if (in_array($file, array(".", "..", "CVS", ".svn"))) {
157 continue;
158 }
159 if (is_dir($skin_dir . DIRECTORY_SEPARATOR . $file)) {
af8e9eeb 160 $arr[$file] = drupal_ucfirst($file);
1b120ffb
JS
161 }
162 }
163 closedir( $dh );
164 }
165 }
166
167 //oops, we have no information about skins, let's use only default
168 if (empty($arr)) {
169 $arr = array(
201b993d 170 'default' => 'Default',
1b120ffb
JS
171 );
172 }
173 asort($arr);
174
175 return $arr;
176}
177
178function fckeditor_load_lang_options() {
179 $arr = array();
29d8625e
WW
180 $editor_local_path = fckeditor_path(TRUE);
181 $lang_dir = $editor_local_path .'/editor/lang';
1b120ffb
JS
182 if (is_dir($lang_dir)) {
183 $dh = @opendir($lang_dir);
184 if (FALSE !== $dh ) {
185 while (($file = readdir($dh)) !== FALSE) {
186 if (in_array($file, array(".", "..", "CVS", ".svn"))) {
187 continue;
188 }
189 $matches = array();
190 if (is_file($lang_dir . DIRECTORY_SEPARATOR . $file) && preg_match('/^(.*?)\.js$/', $file, $matches)) {
191 $lang = $matches[1];
af8e9eeb 192 $arr[$lang] = drupal_strtoupper($lang);
1b120ffb
JS
193 }
194 }
195 closedir( $dh );
196 }
197 }
198
199 //oops, we have no information about languages, let's use those available in FCKeditor 2.4.3
200 if (empty($arr)) {
201 $arr = array(
201b993d 202 'af' => 'Afrikaans',
203 'ar' => 'Arabic',
204 'bg' => 'Bulgarian',
205 'bn' => 'Bengali/Bangla',
206 'bs' => 'Bosnian',
207 'ca' => 'Catalan',
208 'cs' => 'Czech',
209 'da' => 'Danish',
210 'de' => 'German',
211 'el' => 'Greek',
212 'en' => 'English',
213 'en-au' => 'English (Australia)',
214 'en-ca' => 'English (Canadian)',
215 'en-uk' => 'English (United Kingdom)',
216 'eo' => 'Esperanto',
217 'es' => 'Spanish',
218 'et' => 'Estonian',
219 'eu' => 'Basque',
220 'fa' => 'Persian',
221 'fi' => 'Finnish',
222 'fo' => 'Faroese',
223 'fr' => 'French',
224 'gl' => 'Galician',
225 'he' => 'Hebrew',
226 'hi' => 'Hindi',
227 'hr' => 'Croatian',
228 'hu' => 'Hungarian',
229 'it' => 'Italian',
230 'ja' => 'Japanese',
231 'km' => 'Khmer',
232 'ko' => 'Korean',
233 'lt' => 'Lithuanian',
234 'lv' => 'Latvian',
235 'mn' => 'Mongolian',
236 'ms' => 'Malay',
237 'nb' => 'Norwegian Bokmal',
238 'nl' => 'Dutch',
239 'no' => 'Norwegian',
240 'pl' => 'Polish',
241 'pt' => 'Portuguese (Portugal)',
242 'pt-br' => 'Portuguese (Brazil)',
243 'ro' => 'Romanian',
244 'ru' => 'Russian',
245 'sk' => 'Slovak',
246 'sl' => 'Slovenian',
247 'sr' => 'Serbian (Cyrillic)',
248 'sr-latn' => 'Serbian (Latin)',
249 'sv' => 'Swedish',
250 'th' => 'Thai',
251 'tr' => 'Turkish',
252 'uk' => 'Ukrainian',
253 'vi' => 'Vietnamese',
254 'zh' => 'Chinese Traditional',
255 'zh-cn' => 'Chinese Simplified',
1b120ffb
JS
256 );
257 }
258
259 asort($arr);
260
261 return $arr;
29d8625e 262}