4
FCKeditor - The text editor for Internet - http://www.fckeditor.net
5
Copyright (C) 2003-2009 Frederico Caldeira Knabben
9
Licensed under the terms of any of the following licenses at your
12
- GNU General Public License Version 2 or later (the "GPL")
13
http://www.gnu.org/licenses/gpl.html
15
- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
16
http://www.gnu.org/licenses/lgpl.html
18
- Mozilla Public License Version 1.1 or later (the "MPL")
19
http://www.mozilla.org/MPL/MPL-1.1.html
23
Connector for Python (CGI and WSGI).
28
try: # Windows needs stdio set for binary mode for file upload to work.
30
msvcrt.setmode (0, os.O_BINARY) # stdin = 0
31
msvcrt.setmode (1, os.O_BINARY) # stdout = 1
36
from fckoutput import *
37
import config as Config
39
class GetFoldersCommandMixin (object):
40
def getFolders(self, resourceType, currentFolder):
42
Purpose: command to recieve a list of folders
44
# Map the virtual path to our local server
45
serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
46
s = """<Folders>""" # Open the folders node
47
for someObject in os.listdir(serverPath):
48
someObjectPath = mapServerFolder(serverPath, someObject)
49
if os.path.isdir(someObjectPath):
50
s += """<Folder name="%s" />""" % (
51
convertToXmlAttribute(someObject)
53
s += """</Folders>""" # Close the folders node
56
class GetFoldersAndFilesCommandMixin (object):
57
def getFoldersAndFiles(self, resourceType, currentFolder):
59
Purpose: command to recieve a list of folders and files
61
# Map the virtual path to our local server
62
serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
63
# Open the folders / files node
64
folders = """<Folders>"""
66
for someObject in os.listdir(serverPath):
67
someObjectPath = mapServerFolder(serverPath, someObject)
68
if os.path.isdir(someObjectPath):
69
folders += """<Folder name="%s" />""" % (
70
convertToXmlAttribute(someObject)
72
elif os.path.isfile(someObjectPath):
73
size = os.path.getsize(someObjectPath)
75
size = round(size/1024)
78
files += """<File name="%s" size="%d" />""" % (
79
convertToXmlAttribute(someObject),
82
# Close the folders / files node
83
folders += """</Folders>"""
84
files += """</Files>"""
85
return folders + files
87
class CreateFolderCommandMixin (object):
88
def createFolder(self, resourceType, currentFolder):
90
Purpose: command to create a new folder
92
errorNo = 0; errorMsg ='';
93
if self.request.has_key("NewFolderName"):
94
newFolder = self.request.get("NewFolderName", None)
95
newFolder = sanitizeFolderName (newFolder)
97
newFolderPath = mapServerFolder(self.userFilesFolder, combinePaths(currentFolder, newFolder))
98
self.createServerFolder(newFolderPath)
100
errorMsg = str(e).decode('iso-8859-1').encode('utf-8') # warning with encodigns!!!
101
if hasattr(e,'errno'):
102
if e.errno==17: #file already exists
104
elif e.errno==13: # permission denied
106
elif e.errno==36 or e.errno==2 or e.errno==22: # filename too long / no such file / invalid name
112
return self.sendErrorNode ( errorNo, errorMsg )
114
def createServerFolder(self, folderPath):
115
"Purpose: physically creates a folder on the server"
116
# No need to check if the parent exists, just create all hierachy
119
permissions = Config.ChmodOnFolderCreate
121
os.makedirs(folderPath)
122
except AttributeError: #ChmodOnFolderCreate undefined
126
oldumask = os.umask(0)
127
os.makedirs(folderPath,mode=0755)
130
class UploadFileCommandMixin (object):
131
def uploadFile(self, resourceType, currentFolder):
133
Purpose: command to upload files to server (same as FileUpload)
136
if self.request.has_key("NewFile"):
137
# newFile has all the contents we need
138
newFile = self.request.get("NewFile", "")
140
newFileName = newFile.filename
141
newFileName = sanitizeFileName( newFileName )
142
newFileNameOnly = removeExtension(newFileName)
143
newFileExtension = getExtension(newFileName).lower()
144
allowedExtensions = Config.AllowedExtensions[resourceType]
145
deniedExtensions = Config.DeniedExtensions[resourceType]
147
if (allowedExtensions):
150
if (newFileExtension in allowedExtensions):
152
elif (deniedExtensions):
155
if (newFileExtension in deniedExtensions):
158
# No extension limitations
162
# Upload to operating system
163
# Map the virtual path to the local server path
164
currentFolderPath = mapServerFolder(self.userFilesFolder, currentFolder)
167
newFilePath = os.path.join (currentFolderPath,newFileName)
168
if os.path.exists(newFilePath):
170
newFileName = "%s(%d).%s" % (
171
newFileNameOnly, i, newFileExtension
173
errorNo= 201 # file renamed
175
# Read file contents and write to the desired path (similar to php's move_uploaded_file)
176
fout = file(newFilePath, 'wb')
178
chunk = newFile.file.read(100000)
183
if os.path.exists ( newFilePath ):
186
doChmod = Config.ChmodOnUpload
187
permissions = Config.ChmodOnUpload
188
except AttributeError: #ChmodOnUpload undefined
192
oldumask = os.umask(0)
193
os.chmod( newFilePath, permissions )
196
newFileUrl = combinePaths(self.webUserFilesFolder, currentFolder) + newFileName
198
return self.sendUploadResults( errorNo , newFileUrl, newFileName )
200
return self.sendUploadResults( errorNo = 202, customMsg = "" )
202
return self.sendUploadResults( errorNo = 202, customMsg = "No File" )