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

数据库编程

开发平台:

Visual C++

  1. #!/usr/bin/env python
  2. """
  3. FCKeditor - The text editor for Internet - http://www.fckeditor.net
  4. Copyright (C) 2003-2007 Frederico Caldeira Knabben
  5. == BEGIN LICENSE ==
  6. Licensed under the terms of any of the following licenses at your
  7. choice:
  8. - GNU General Public License Version 2 or later (the "GPL")
  9. http://www.gnu.org/licenses/gpl.html
  10. - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  11. http://www.gnu.org/licenses/lgpl.html
  12. - Mozilla Public License Version 1.1 or later (the "MPL")
  13. http://www.mozilla.org/MPL/MPL-1.1.html
  14. == END LICENSE ==
  15. Connector for Python (CGI and WSGI).
  16. """
  17. import os
  18. try: # Windows needs stdio set for binary mode for file upload to work.
  19. import msvcrt
  20. msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
  21. msvcrt.setmode (1, os.O_BINARY) # stdout = 1
  22. except ImportError:
  23. pass
  24. from fckutil import *
  25. from fckoutput import *
  26. import config as Config
  27. class GetFoldersCommandMixin (object):
  28. def getFolders(self, resourceType, currentFolder):
  29. """
  30. Purpose: command to recieve a list of folders
  31. """
  32. # Map the virtual path to our local server
  33. serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
  34. s = """<Folders>"""  # Open the folders node
  35. for someObject in os.listdir(serverPath):
  36. someObjectPath = mapServerFolder(serverPath, someObject)
  37. if os.path.isdir(someObjectPath):
  38. s += """<Folder name="%s" />""" % (
  39. convertToXmlAttribute(someObject)
  40. )
  41. s += """</Folders>""" # Close the folders node
  42. return s
  43. class GetFoldersAndFilesCommandMixin (object):
  44. def getFoldersAndFiles(self, resourceType, currentFolder):
  45. """
  46. Purpose: command to recieve a list of folders and files
  47. """
  48. # Map the virtual path to our local server
  49. serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
  50. # Open the folders / files node
  51. folders = """<Folders>"""
  52. files = """<Files>"""
  53. for someObject in os.listdir(serverPath):
  54. someObjectPath = mapServerFolder(serverPath, someObject)
  55. if os.path.isdir(someObjectPath):
  56. folders += """<Folder name="%s" />""" % (
  57. convertToXmlAttribute(someObject)
  58. )
  59. elif os.path.isfile(someObjectPath):
  60. size = os.path.getsize(someObjectPath)
  61. files += """<File name="%s" size="%s" />""" % (
  62. convertToXmlAttribute(someObject),
  63. os.path.getsize(someObjectPath)
  64. )
  65. # Close the folders / files node
  66. folders += """</Folders>"""
  67. files += """</Files>"""
  68. return folders + files
  69. class CreateFolderCommandMixin (object):
  70. def createFolder(self, resourceType, currentFolder):
  71. """
  72. Purpose: command to create a new folder
  73. """
  74. errorNo = 0; errorMsg ='';
  75. if self.request.has_key("NewFolderName"):
  76. newFolder = self.request.get("NewFolderName", None)
  77. newFolder = sanitizeFolderName (newFolder)
  78. try:
  79. newFolderPath = mapServerFolder(self.userFilesFolder, combinePaths(currentFolder, newFolder))
  80. self.createServerFolder(newFolderPath)
  81. except Exception, e:
  82. errorMsg = str(e).decode('iso-8859-1').encode('utf-8') # warning with encodigns!!!
  83. if hasattr(e,'errno'):
  84. if e.errno==17: #file already exists
  85. errorNo=0
  86. elif e.errno==13: # permission denied
  87. errorNo = 103
  88. elif e.errno==36 or e.errno==2 or e.errno==22: # filename too long / no such file / invalid name
  89. errorNo = 102 
  90. else:
  91. errorNo = 110
  92. else:
  93. errorNo = 102
  94. return self.sendErrorNode ( errorNo, errorMsg )
  95. def createServerFolder(self, folderPath):
  96. "Purpose: physically creates a folder on the server"
  97. # No need to check if the parent exists, just create all hierachy
  98. oldumask = os.umask(0)
  99. os.makedirs(folderPath,mode=0755)
  100. os.umask( oldumask ) 
  101. class UploadFileCommandMixin (object):
  102. def uploadFile(self, resourceType, currentFolder):
  103. """
  104. Purpose: command to upload files to server (same as FileUpload)
  105. """
  106. errorNo = 0
  107. if self.request.has_key("NewFile"):
  108. # newFile has all the contents we need
  109. newFile = self.request.get("NewFile", "")
  110. # Get the file name
  111. newFileName = newFile.filename
  112. newFileName = sanitizeFileName( newFileName ) 
  113. newFileNameOnly = removeExtension(newFileName)
  114. newFileExtension = getExtension(newFileName).lower()
  115. allowedExtensions = Config.AllowedExtensions[resourceType]
  116. deniedExtensions = Config.DeniedExtensions[resourceType]
  117. if (allowedExtensions):
  118. # Check for allowed
  119. isAllowed = False
  120. if (newFileExtension in allowedExtensions):
  121. isAllowed = True
  122. elif (deniedExtensions):
  123. # Check for denied
  124. isAllowed = True
  125. if (newFileExtension in deniedExtensions):
  126. isAllowed = False
  127. else:
  128. # No extension limitations
  129. isAllowed = True
  130. if (isAllowed):
  131. # Upload to operating system
  132. # Map the virtual path to the local server path
  133. currentFolderPath = mapServerFolder(self.userFilesFolder, currentFolder)
  134. i = 0
  135. while (True):
  136. newFilePath = os.path.join (currentFolderPath,newFileName)
  137. if os.path.exists(newFilePath):
  138. i += 1
  139. newFileName = "%s(%04d).%s" % (
  140. newFileNameOnly, i, newFileExtension
  141. )
  142. errorNo= 201 # file renamed
  143. else:
  144. # Read file contents and write to the desired path (similar to php's move_uploaded_file)
  145. fout = file(newFilePath, 'wb')
  146. while (True):
  147. chunk = newFile.file.read(100000)
  148. if not chunk: break
  149. fout.write (chunk)
  150. fout.close()
  151. if os.path.exists ( newFilePath ):
  152. oldumask = os.umask(0) 
  153. os.chmod( newFilePath, 0755 ) 
  154. os.umask( oldumask ) 
  155. newFileUrl = self.webUserFilesFolder + currentFolder + newFileName
  156. return self.sendUploadResults( errorNo , newFileUrl, newFileName )
  157. else:
  158. return self.sendUploadResults( errorNo = 203, customMsg = "Extension not allowed" )
  159. else:
  160. return self.sendUploadResults( errorNo = 202, customMsg = "No File" )