/pigeoncms/Plugins/fckeditor/editor/filemanager/connectors/py/fckcommands.py

http://pigeoncms.googlecode.com/ · Python · 202 lines · 152 code · 15 blank · 35 comment · 42 complexity · a6a792e6970311c26adf71b5d927076e MD5 · raw file

  1. #!/usr/bin/env python
  2. """
  3. FCKeditor - The text editor for Internet - http://www.fckeditor.net
  4. Copyright (C) 2003-2009 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. if size > 0:
  62. size = round(size/1024)
  63. if size < 1:
  64. size = 1
  65. files += """<File name="%s" size="%d" />""" % (
  66. convertToXmlAttribute(someObject),
  67. size
  68. )
  69. # Close the folders / files node
  70. folders += """</Folders>"""
  71. files += """</Files>"""
  72. return folders + files
  73. class CreateFolderCommandMixin (object):
  74. def createFolder(self, resourceType, currentFolder):
  75. """
  76. Purpose: command to create a new folder
  77. """
  78. errorNo = 0; errorMsg ='';
  79. if self.request.has_key("NewFolderName"):
  80. newFolder = self.request.get("NewFolderName", None)
  81. newFolder = sanitizeFolderName (newFolder)
  82. try:
  83. newFolderPath = mapServerFolder(self.userFilesFolder, combinePaths(currentFolder, newFolder))
  84. self.createServerFolder(newFolderPath)
  85. except Exception, e:
  86. errorMsg = str(e).decode('iso-8859-1').encode('utf-8') # warning with encodigns!!!
  87. if hasattr(e,'errno'):
  88. if e.errno==17: #file already exists
  89. errorNo=0
  90. elif e.errno==13: # permission denied
  91. errorNo = 103
  92. elif e.errno==36 or e.errno==2 or e.errno==22: # filename too long / no such file / invalid name
  93. errorNo = 102
  94. else:
  95. errorNo = 110
  96. else:
  97. errorNo = 102
  98. return self.sendErrorNode ( errorNo, errorMsg )
  99. def createServerFolder(self, folderPath):
  100. "Purpose: physically creates a folder on the server"
  101. # No need to check if the parent exists, just create all hierachy
  102. try:
  103. permissions = Config.ChmodOnFolderCreate
  104. if not permissions:
  105. os.makedirs(folderPath)
  106. except AttributeError: #ChmodOnFolderCreate undefined
  107. permissions = 0755
  108. if permissions:
  109. oldumask = os.umask(0)
  110. os.makedirs(folderPath,mode=0755)
  111. os.umask( oldumask )
  112. class UploadFileCommandMixin (object):
  113. def uploadFile(self, resourceType, currentFolder):
  114. """
  115. Purpose: command to upload files to server (same as FileUpload)
  116. """
  117. errorNo = 0
  118. if self.request.has_key("NewFile"):
  119. # newFile has all the contents we need
  120. newFile = self.request.get("NewFile", "")
  121. # Get the file name
  122. newFileName = newFile.filename
  123. newFileName = sanitizeFileName( newFileName )
  124. newFileNameOnly = removeExtension(newFileName)
  125. newFileExtension = getExtension(newFileName).lower()
  126. allowedExtensions = Config.AllowedExtensions[resourceType]
  127. deniedExtensions = Config.DeniedExtensions[resourceType]
  128. if (allowedExtensions):
  129. # Check for allowed
  130. isAllowed = False
  131. if (newFileExtension in allowedExtensions):
  132. isAllowed = True
  133. elif (deniedExtensions):
  134. # Check for denied
  135. isAllowed = True
  136. if (newFileExtension in deniedExtensions):
  137. isAllowed = False
  138. else:
  139. # No extension limitations
  140. isAllowed = True
  141. if (isAllowed):
  142. # Upload to operating system
  143. # Map the virtual path to the local server path
  144. currentFolderPath = mapServerFolder(self.userFilesFolder, currentFolder)
  145. i = 0
  146. while (True):
  147. newFilePath = os.path.join (currentFolderPath,newFileName)
  148. if os.path.exists(newFilePath):
  149. i += 1
  150. newFileName = "%s(%d).%s" % (
  151. newFileNameOnly, i, newFileExtension
  152. )
  153. errorNo= 201 # file renamed
  154. else:
  155. # Read file contents and write to the desired path (similar to php's move_uploaded_file)
  156. fout = file(newFilePath, 'wb')
  157. while (True):
  158. chunk = newFile.file.read(100000)
  159. if not chunk: break
  160. fout.write (chunk)
  161. fout.close()
  162. if os.path.exists ( newFilePath ):
  163. doChmod = False
  164. try:
  165. doChmod = Config.ChmodOnUpload
  166. permissions = Config.ChmodOnUpload
  167. except AttributeError: #ChmodOnUpload undefined
  168. doChmod = True
  169. permissions = 0755
  170. if ( doChmod ):
  171. oldumask = os.umask(0)
  172. os.chmod( newFilePath, permissions )
  173. os.umask( oldumask )
  174. newFileUrl = combinePaths(self.webUserFilesFolder, currentFolder) + newFileName
  175. return self.sendUploadResults( errorNo , newFileUrl, newFileName )
  176. else:
  177. return self.sendUploadResults( errorNo = 202, customMsg = "" )
  178. else:
  179. return self.sendUploadResults( errorNo = 202, customMsg = "No File" )