cf5_connector.cfm
上传用户:ah_jiwei
上传日期:2022-07-24
资源大小:54044k
文件大小:10k
源码类别:

数据库编程

开发平台:

Visual C++

  1. <cfsetting enablecfoutputonly="yes" showdebugoutput="no">
  2. <!---
  3.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  4.  * Copyright (C) 2003-2007 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.  * File Browser connector for ColdFusion 5.
  23.  * (based on the original CF connector by Hendrik Kramer - hk@lwd.de)
  24.  *
  25.  * Note:
  26.  * FCKeditor requires that the connector responds with UTF-8 encoded XML.
  27.  * As ColdFusion 5 does not fully support UTF-8 encoding, we force ASCII
  28.  * file and folder names in this connector to allow CF5 send a UTF-8
  29.  * encoded response - code points under 127 in UTF-8 are stored using a
  30.  * single byte, using the same encoding as ASCII, which is damn handy.
  31.  * This is all grand for the English speakers, like meself, but I dunno
  32.  * how others are gonna take to it. Well, the previous version of this
  33.  * connector already did this with file names and nobody seemed to mind,
  34.  * so fingers-crossed nobody will mind their folder names being munged too.
  35.  *
  36. --->
  37. <cfparam name="url.command">
  38. <cfparam name="url.type">
  39. <cfparam name="url.currentFolder">
  40. <!--- note: no serverPath url parameter - see config.cfm if you need to set the serverPath manually --->
  41. <cfinclude template="config.cfm">
  42. <cfscript>
  43. userFilesPath = config.userFilesPath;
  44. if ( userFilesPath eq "" )
  45. {
  46. userFilesPath = "/userfiles/";
  47. }
  48. // make sure the user files path is correctly formatted
  49. userFilesPath = replace(userFilesPath, "", "/", "ALL");
  50. userFilesPath = replace(userFilesPath, '//', '/', 'ALL');
  51. if ( right(userFilesPath,1) NEQ "/" )
  52. {
  53. userFilesPath = userFilesPath & "/";
  54. }
  55. if ( left(userFilesPath,1) NEQ "/" )
  56. {
  57. userFilesPath = "/" & userFilesPath;
  58. }
  59. // make sure the current folder is correctly formatted
  60. url.currentFolder = replace(url.currentFolder, "", "/", "ALL");
  61. url.currentFolder = replace(url.currentFolder, '//', '/', 'ALL');
  62. if ( right(url.currentFolder,1) neq "/" )
  63. {
  64. url.currentFolder = url.currentFolder & "/";
  65. }
  66. if ( left(url.currentFolder,1) neq "/" )
  67. {
  68. url.currentFolder = "/" & url.currentFolder;
  69. }
  70. if ( find("/",getBaseTemplatePath()) neq 0 )
  71. {
  72. fs = "/";
  73. }
  74. else
  75. {
  76. fs = "";
  77. }
  78. // Get the base physical path to the web root for this application. The code to determine the path automatically assumes that
  79. // the "FCKeditor" directory in the http request path is directly off the web root for the application and that it's not a
  80. // virtual directory or a symbolic link / junction. Use the serverPath config setting to force a physical path if necessary.
  81. if ( len(config.serverPath) )
  82. {
  83. serverPath = config.serverPath;
  84. if ( right(serverPath,1) neq fs )
  85. {
  86. serverPath = serverPath & fs;
  87. }
  88. }
  89. else
  90. {
  91. serverPath = replaceNoCase(getBaseTemplatePath(),replace(cgi.script_name,"/",fs,"all"),"") & replace(userFilesPath,"/",fs,"all");
  92. }
  93. rootPath = left( serverPath, Len(serverPath) - Len(userFilesPath) ) ;
  94. xmlContent = ""; // append to this string to build content
  95. </cfscript>
  96. <cfset resourceTypeUrl = rereplace( replace( Config.FileTypesPath[url.type], fs, "/", "all"), "/$", "") >
  97. <cfif isDefined( "Config.FileTypesAbsolutePath" )
  98. and structkeyexists( Config.FileTypesAbsolutePath, url.type )
  99. and Len( Config.FileTypesAbsolutePath[url.type] )>
  100. <cfset userFilesServerPath = Config.FileTypesAbsolutePath[url.type] & url.currentFolder>
  101. <cfelse>
  102. <cftry>
  103. <cfset userFilesServerPath = expandpath( resourceTypeUrl ) & url.currentFolder>
  104. <!--- Catch: Parameter 1 of function ExpandPath must be a relative path --->
  105. <cfcatch type="any">
  106. <cfset userFilesServerPath = rootPath & Config.FileTypesPath[url.type] & url.currentFolder>
  107. </cfcatch>
  108. </cftry>
  109. </cfif>
  110. <cfset userFilesServerPath = replace( userFilesServerPath, "/", fs, "all" ) >
  111. <!--- get rid of double directory separators --->
  112. <cfset userFilesServerPath = replace( userFilesServerPath, fs & fs, fs, "all") >
  113. <cfif not config.enabled>
  114. <cfset xmlContent = "<Error number=""1"" text=""This connector is disabled. Please check the 'editor/filemanager/connectors/cfm/config.cfm' file"" />">
  115. <cfelseif find("..",url.currentFolder)>
  116. <cfset xmlContent = "<Error number=""102"" />">
  117. <cfelseif isDefined("Config.ConfigAllowedCommands") and not ListFind(Config.ConfigAllowedCommands, url.command)>
  118. <cfset xmlContent = '<Error number="1" text="The &quot;' & url.command & '&quot; command isn''t allowed" />'>
  119. <cfelseif isDefined("Config.ConfigAllowedTypes") and not ListFind(Config.ConfigAllowedTypes, url.type)>
  120. <cfset xmlContent = '<Error number="1" text="The &quot;' & url.type & '&quot; type isn''t allowed" />'>
  121. </cfif>
  122. <cfset resourceTypeDirectory = left( userFilesServerPath, Len(userFilesServerPath) - Len(url.currentFolder) )>
  123. <cfif not len(xmlContent) and not directoryexists(resourceTypeDirectory)>
  124. <!--- create directories in physical path if they don't already exist --->
  125. <cfset currentPath = "">
  126. <cftry>
  127. <cfloop list="#resourceTypeDirectory#" index="name" delimiters="#fs#">
  128. <cfif currentPath eq "" and fs eq "">
  129. <!--- Without checking this, we would have in Windows C: --->
  130. <cfif not directoryExists(name)>
  131. <cfdirectory action="create" directory="#name#" mode="755">
  132. </cfif>
  133. <cfelse>
  134. <cfif not directoryExists(currentPath & fs & name)>
  135. <cfdirectory action="create" directory="#currentPath##fs##name#" mode="755">
  136. </cfif>
  137. </cfif>
  138. <cfif fs eq "" and currentPath eq "">
  139. <cfset currentPath = name>
  140. <cfelse>
  141. <cfset currentPath = currentPath & fs & name>
  142. </cfif>
  143. </cfloop>
  144. <cfcatch type="any">
  145. <!--- this should only occur as a result of a permissions problem --->
  146. <cfset xmlContent = "<Error number=""103"" />">
  147. </cfcatch>
  148. </cftry>
  149. </cfif>
  150. <cfif not len(xmlContent)>
  151. <!--- no errors thus far - run command --->
  152. <!--- we need to know the physical path to the current folder for all commands --->
  153. <cfset currentFolderPath = userFilesServerPath>
  154. <cfswitch expression="#url.command#">
  155. <cfcase value="FileUpload">
  156. <cfset config_included = true >
  157. <cfinclude template="cf5_upload.cfm">
  158. <cfabort>
  159. </cfcase>
  160. <cfcase value="GetFolders">
  161. <!--- Sort directories first, name ascending --->
  162. <cfdirectory
  163. action="list"
  164. directory="#currentFolderPath#"
  165. name="qDir"
  166. sort="type,name">
  167. <cfscript>
  168. i=1;
  169. folders = "";
  170. while( i lte qDir.recordCount ) {
  171. if( not compareNoCase( qDir.type[i], "FILE" ))
  172. break;
  173. if( not listFind(".,..", qDir.name[i]) )
  174. folders = folders & '<Folder name="#HTMLEditFormat( qDir.name[i] )#" />';
  175. i=i+1;
  176. }
  177. xmlContent = xmlContent & '<Folders>' & folders & '</Folders>';
  178. </cfscript>
  179. </cfcase>
  180. <cfcase value="GetFoldersAndFiles">
  181. <!--- Sort directories first, name ascending --->
  182. <cfdirectory
  183. action="list"
  184. directory="#currentFolderPath#"
  185. name="qDir"
  186. sort="type,name">
  187. <cfscript>
  188. i=1;
  189. folders = "";
  190. files = "";
  191. while( i lte qDir.recordCount ) {
  192. if( not compareNoCase( qDir.type[i], "DIR" ) and not listFind(".,..", qDir.name[i]) ) {
  193. folders = folders & '<Folder name="#HTMLEditFormat(qDir.name[i])#" />';
  194. } else if( not compareNoCase( qDir.type[i], "FILE" ) ) {
  195. fileSizeKB = round(qDir.size[i] / 1024);
  196. files = files & '<File name="#HTMLEditFormat(qDir.name[i])#" size="#IIf( fileSizeKB GT 0, DE( fileSizeKB ), 1)#" />';
  197. }
  198. i=i+1;
  199. }
  200. xmlContent = xmlContent & '<Folders>' & folders & '</Folders>';
  201. xmlContent = xmlContent & '<Files>' & files & '</Files>';
  202. </cfscript>
  203. </cfcase>
  204. <cfcase value="CreateFolder">
  205. <cfparam name="url.newFolderName" default="">
  206. <cfscript>
  207. newFolderName = url.newFolderName;
  208. if( reFind("[^A-Za-z0-9_-.]", newFolderName) ) {
  209. // Munge folder name same way as we do the filename
  210. // This means folder names are always US-ASCII so we don't have to worry about CF5 and UTF-8
  211. newFolderName = reReplace(newFolderName, "[^A-Za-z0-9-.]", "_", "all");
  212. newFolderName = reReplace(newFolderName, "_{2,}", "_", "all");
  213. newFolderName = reReplace(newFolderName, "([^_]+)_+$", "1", "all");
  214. newFolderName = reReplace(newFolderName, "$_([^_]+)$", "1", "all");
  215. }
  216. </cfscript>
  217. <cfif not len(newFolderName) or len(newFolderName) gt 255>
  218. <cfset errorNumber = 102>
  219. <cfelseif directoryExists(currentFolderPath & newFolderName)>
  220. <cfset errorNumber = 101>
  221. <cfelseif reFind("^..",newFolderName)>
  222. <cfset errorNumber = 103>
  223. <cfelse>
  224. <cfset errorNumber = 0>
  225. <cftry>
  226. <cfdirectory
  227. action="create"
  228. directory="#currentFolderPath##newFolderName#"
  229. mode="755">
  230. <cfcatch>
  231. <!---
  232. un-resolvable error numbers in ColdFusion:
  233. * 102 : Invalid folder name.
  234. * 103 : You have no permissions to create the folder.
  235. --->
  236. <cfset errorNumber = 110>
  237. </cfcatch>
  238. </cftry>
  239. </cfif>
  240. <cfset xmlContent = xmlContent & '<Error number="#errorNumber#" />'>
  241. </cfcase>
  242. <cfdefaultcase>
  243. <cfthrow type="fckeditor.connector" message="Illegal command: #url.command#">
  244. </cfdefaultcase>
  245. </cfswitch>
  246. </cfif>
  247. <cfscript>
  248. xmlHeader = '<?xml version="1.0" encoding="utf-8" ?><Connector command="#url.command#" resourceType="#url.type#">';
  249. xmlHeader = xmlHeader & '<CurrentFolder path="#url.currentFolder#" url="#resourceTypeUrl##url.currentFolder#" />';
  250. xmlFooter = '</Connector>';
  251. </cfscript>
  252. <cfheader name="Expires" value="#GetHttpTimeString(Now())#">
  253. <cfheader name="Pragma" value="no-cache">
  254. <cfheader name="Cache-Control" value="no-cache, no-store, must-revalidate">
  255. <cfcontent reset="true" type="text/xml; charset=UTF-8">
  256. <cfoutput>#xmlHeader##xmlContent##xmlFooter#</cfoutput>