PageRenderTime 30ms CodeModel.GetById 15ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 1ms

/pigeoncms/Plugins/fckeditor/editor/filemanager/connectors/lasso/connector.lasso

http://pigeoncms.googlecode.com/
Unknown | 330 lines | 289 code | 41 blank | 0 comment | 0 complexity | 3f26ace307f0b0333a7785ffe9e47e7f MD5 | raw file
  1[//lasso
  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 * This is the File Manager Connector for Lasso.
 23 */
 24
 25    /*.....................................................................
 26    Include global configuration. See config.lasso for details.
 27    */
 28	include('config.lasso');
 29
 30
 31    /*.....................................................................
 32    Translate current date/time to GMT for custom header.
 33    */
 34	var('headerDate') = date_localtogmt(date)->format('%a, %d %b %Y %T GMT');
 35
 36
 37    /*.....................................................................
 38    Convert query string parameters to variables and initialize output.
 39    */
 40	var(
 41		'Command'		=	(Encode_HTML: action_param('Command')),
 42		'Type'			=	(Encode_HTML: action_param('Type')),
 43		'CurrentFolder'	=	action_param('CurrentFolder'),
 44		'ServerPath'	=	action_param('ServerPath'),
 45		'NewFolderName'	=	action_param('NewFolderName'),
 46		'NewFile'		=	null,
 47		'NewFileName'	=	string,
 48		'OrigFilePath'	=	string,
 49		'NewFilePath'	=	string,
 50		'commandData'	=	string,
 51		'folders'		=	'\t<Folders>\n',
 52		'files'			=	'\t<Files>\n',
 53		'errorNumber'	=	integer,
 54		'responseType'	=	'xml',
 55		'uploadResult'	=	'0'
 56	);
 57
 58	/*.....................................................................
 59	Custom tag sets the HTML response.
 60	*/
 61
 62	define_tag(
 63		'htmlreply',
 64		-namespace='fck_',
 65		-priority='replace',
 66		-required='uploadResult',
 67		-optional='NewFilePath',
 68		-type='string',
 69		-description='Sets the HTML response for the FCKEditor File Upload feature.'
 70	);
 71		$__html_reply__ = '\
 72<script type="text/javascript">
 73(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\\.|$)/,\'\');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();
 74';
 75			if($uploadResult == '0' || $uploadResult == '201');
 76			$__html_reply__ = $__html_reply__ + '\
 77	window.parent.OnUploadCompleted(' + $uploadResult + ',"' + $NewFilePath + '","' + $NewFilePath->split('/')->last + '");
 78</script>
 79			';
 80			else;
 81			$__html_reply__ = $__html_reply__ + '\
 82	window.parent.OnUploadCompleted(' + $uploadResult + ',"","");
 83</script>
 84			';
 85			/if;
 86	/define_tag;
 87
 88
 89    /*.....................................................................
 90    Calculate the path to the current folder.
 91    */
 92	$ServerPath == '' ? $ServerPath = $config->find('UserFilesPath');
 93
 94	var('currentFolderURL' = $ServerPath
 95		+ $config->find('Subdirectories')->find(action_param('Type'))
 96		+ $CurrentFolder
 97	);
 98
 99	$currentFolderURL = string_replace($currentFolderURL, -find='//', -replace='/');
100
101	if (!$config->find('Subdirectories')->find(action_param('Type')));
102		if($Command == 'FileUpload');
103			$responseType = 'html';
104			$uploadResult = '1';
105			fck_htmlreply(
106				-uploadResult=$uploadResult
107			);
108		else;
109			$errorNumber = 1;
110			$commandData += '<Error number="' + $errorNumber + '" text="Invalid type specified" />\n';
111		/if;
112	else if($CurrentFolder->(Find: '..') || (String_FindRegExp: $CurrentFolder, -Find='(/\\.)|(//)|[\\\\:\\*\\?\\""\\<\\>\\|]|\\000|[\u007F]|[\u0001-\u001F]'));
113		if($Command == 'FileUpload');
114			$responseType = 'html';
115			$uploadResult = '102';
116			fck_htmlreply(
117				-uploadResult=$uploadResult
118			);
119		else;
120			$errorNumber = 102;
121			$commandData += '<Error number="' + $errorNumber + '" />\n';
122		/if;
123	else;
124
125    /*.....................................................................
126    Build the appropriate response per the 'Command' parameter. Wrap the
127    entire process in an inline for file tag permissions.
128    */
129		if($config->find('Enabled'));
130		inline($connection);
131		select($Command);
132            /*.............................................................
133            List all subdirectories in the 'Current Folder' directory.
134            */
135			case('GetFolders');
136				$commandData += '\t<Folders>\n';
137
138				iterate(file_listdirectory($currentFolderURL), local('this'));
139					#this->endswith('/') ? $commandData += '\t\t<Folder name="' + #this->removetrailing('/')& + '" />\n';
140				/iterate;
141
142				$commandData += '\t</Folders>\n';
143
144
145            /*.............................................................
146            List both files and folders in the 'Current Folder' directory.
147            Include the file sizes in kilobytes.
148            */
149			case('GetFoldersAndFiles');
150				iterate(file_listdirectory($currentFolderURL), local('this'));
151					if(#this->endswith('/'));
152						$folders += '\t\t<Folder name="' + #this->removetrailing('/')& + '" />\n';
153					else;
154						local('size') = file_getsize($currentFolderURL + #this);
155						if($size>0);
156							$size = $size/1024;
157							if ($size==0);
158								$size = 1;
159							/if;
160						/if;
161						$files += '\t\t<File name="' + #this + '" size="' + #size + '" />\n';
162					/if;
163				/iterate;
164
165				$folders += '\t</Folders>\n';
166				$files += '\t</Files>\n';
167
168				$commandData += $folders + $files;
169
170
171            /*.............................................................
172            Create a directory 'NewFolderName' within the 'Current Folder.'
173            */
174			case('CreateFolder');
175				$NewFolderName = (String_ReplaceRegExp: $NewFolderName, -find='\\.|\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|\\000|[\u007F]|[\u0001-\u001F]', -replace='_');
176				var('newFolder' = $currentFolderURL + $NewFolderName + '/');
177				file_create($newFolder);
178
179
180                /*.........................................................
181                Map Lasso's file error codes to FCKEditor's error codes.
182                */
183				select(file_currenterror( -errorcode));
184					case(0);
185						$errorNumber = 0;
186					case( -9983);
187						$errorNumber = 101;
188					case( -9976);
189						$errorNumber = 102;
190					case( -9977);
191						$errorNumber = 102;
192					case( -9961);
193						$errorNumber = 103;
194					case;
195						$errorNumber = 110;
196				/select;
197
198				$commandData += '<Error number="' + $errorNumber + '" />\n';
199
200
201            /*.............................................................
202            Process an uploaded file.
203            */
204			case('FileUpload');
205                /*.........................................................
206                This is the only command that returns an HTML response.
207                */
208				$responseType = 'html';
209
210
211                /*.........................................................
212                Was a file actually uploaded?
213                */
214                if(file_uploads->size);
215                	$NewFile = file_uploads->get(1);
216                else;
217                	$uploadResult = '202';
218                /if;
219
220				if($uploadResult == '0');
221                    /*.....................................................
222                    Split the file's extension from the filename in order
223                    to follow the API's naming convention for duplicate
224                    files. (Test.txt, Test(1).txt, Test(2).txt, etc.)
225                    */
226					$NewFileName = $NewFile->find('OrigName');
227					$NewFileName = (String_ReplaceRegExp: $NewFileName, -find='\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|\\000|[\u007F]|[\u0001-\u001F]', -replace='_');
228					$NewFileName = (String_ReplaceRegExp: $NewFileName, -find='\\.(?![^.]*$)', -replace='_');
229					$OrigFilePath = $currentFolderURL + $NewFileName;
230					$NewFilePath = $OrigFilePath;
231					local('fileExtension') = '.' + $NewFile->find('OrigExtension');
232					#fileExtension = (String_ReplaceRegExp: #fileExtension, -find='\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|\\000|[\u007F]|[\u0001-\u001F]', -replace='_');
233					local('shortFileName') = $NewFileName->removetrailing(#fileExtension)&;
234
235
236                    /*.....................................................
237                    Make sure the file extension is allowed.
238                    */
239					local('allowedExt') = $config->find('AllowedExtensions')->find($Type);
240					local('deniedExt') = $config->find('DeniedExtensions')->find($Type);
241					if($allowedExt->Size > 0 && $allowedExt !>> $NewFile->find('OrigExtension'));
242						$uploadResult = '202';
243					else($deniedExt->Size > 0 && $deniedExt >> $NewFile->find('OrigExtension'));
244						$uploadResult = '202';
245					else;
246                        /*.................................................
247                        Rename the target path until it is unique.
248                        */
249						while(file_exists($NewFilePath));
250							$NewFilePath = $currentFolderURL + #shortFileName + '(' + loop_count + ')' + #fileExtension;
251						/while;
252
253
254                        /*.................................................
255                        Copy the uploaded file to its final location.
256                        */
257						file_copy($NewFile->find('path'), $NewFilePath);
258
259
260                        /*.................................................
261                        Set the error code for the response. Note whether
262                        the file had to be renamed.
263                        */
264						select(file_currenterror( -errorcode));
265							case(0);
266								$OrigFilePath != $NewFilePath ? $uploadResult = 201;
267							case;
268								$uploadResult = file_currenterror( -errorcode);
269						/select;
270					/if;
271				/if;
272				fck_htmlreply(
273					-uploadResult=$uploadResult,
274					-NewFilePath=$NewFilePath
275				);
276			case;
277				$errorNumber = 1;
278				$commandData += '<Error number="' + $errorNumber + '" text="Command isn\'t allowed" />\n';
279		/select;
280		/inline;
281		else;
282			$errorNumber = 1;
283			$commandData += '<Error number="' + $errorNumber + '" text="This file uploader is disabled. Please check the editor/filemanager/upload/lasso/config.lasso file." />\n';
284		/if;
285	/if;
286
287    /*.....................................................................
288    Send a custom header for xml responses.
289    */
290	if($responseType == 'xml');
291		header;
292]
293HTTP/1.0 200 OK
294Date: [$headerDate]
295Server: Lasso Professional [lasso_version( -lassoversion)]
296Expires: Mon, 26 Jul 1997 05:00:00 GMT
297Last-Modified: [$headerDate]
298Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
299Pragma: no-cache
300Keep-Alive: timeout=15, max=98
301Connection: Keep-Alive
302Content-Type: text/xml; charset=utf-8
303[//lasso
304/header;
305
306		/*
307			Set the content type encoding for Lasso.
308		*/
309		content_type('text/xml; charset=utf-8');
310
311		/*
312			Wrap the response as XML and output.
313		*/
314		$__html_reply__ = '\
315<?xml version="1.0" encoding="utf-8" ?>';
316
317		if($errorNumber != '102');
318			$__html_reply__ += '<Connector command="' + (Encode_HTML: $Command) + '" resourceType="' + (Encode_HTML: $Type) + '">';
319		else;
320			$__html_reply__ += '<Connector>';
321		/if;
322
323		if($errorNumber != '102');
324			$__html_reply__ += '<CurrentFolder path="' + (Encode_HTML: $CurrentFolder) + '" url="' + (Encode_HTML: $currentFolderURL) + '" />';
325		/if;
326
327		$__html_reply__ += $commandData + '
328</Connector>';
329	/if;
330]