Project

General

Profile

1
#!/usr/bin/env python
2

    
3
"""
4
FCKeditor - The text editor for Internet - http://www.fckeditor.net
5
Copyright (C) 2003-2009 Frederico Caldeira Knabben
6

    
7
== BEGIN LICENSE ==
8

    
9
Licensed under the terms of any of the following licenses at your
10
choice:
11

    
12
- GNU General Public License Version 2 or later (the "GPL")
13
http://www.gnu.org/licenses/gpl.html
14

    
15
- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
16
http://www.gnu.org/licenses/lgpl.html
17

    
18
- Mozilla Public License Version 1.1 or later (the "MPL")
19
http://www.mozilla.org/MPL/MPL-1.1.html
20

    
21
== END LICENSE ==
22

    
23
Utility functions for the File Manager Connector for Python
24

    
25
"""
26

    
27
import string, re
28
import os
29
import config as Config
30

    
31
# Generic manipulation functions
32

    
33
def removeExtension(fileName):
34
	index = fileName.rindex(".")
35
	newFileName = fileName[0:index]
36
	return newFileName
37

    
38
def getExtension(fileName):
39
	index = fileName.rindex(".") + 1
40
	fileExtension = fileName[index:]
41
	return fileExtension
42

    
43
def removeFromStart(string, char):
44
	return string.lstrip(char)
45

    
46
def removeFromEnd(string, char):
47
	return string.rstrip(char)
48

    
49
# Path functions
50

    
51
def combinePaths( basePath, folder ):
52
	return removeFromEnd( basePath, '/' ) + '/' + removeFromStart( folder, '/' )
53

    
54
def getFileName(filename):
55
	" Purpose: helper function to extrapolate the filename "
56
	for splitChar in ["/", "\\"]:
57
		array = filename.split(splitChar)
58
		if (len(array) > 1):
59
			filename = array[-1]
60
	return filename
61

    
62
def sanitizeFolderName( newFolderName ):
63
	"Do a cleanup of the folder name to avoid possible problems"
64
	# Remove . \ / | : ? * " < > and control characters
65
	return re.sub( '\\.|\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[\x00-\x1f\x7f-\x9f]', '_', newFolderName )
66

    
67
def sanitizeFileName( newFileName ):
68
	"Do a cleanup of the file name to avoid possible problems"
69
	# Replace dots in the name with underscores (only one dot can be there... security issue).
70
	if ( Config.ForceSingleExtension ): # remove dots
71
		newFileName = re.sub ( '\\.(?![^.]*$)', '_', newFileName ) ;
72
	newFileName = newFileName.replace('\\','/')		# convert windows to unix path
73
	newFileName = os.path.basename (newFileName)	# strip directories
74
	# Remove \ / | : ? *
75
	return re.sub ( '\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[\x00-\x1f\x7f-\x9f]/', '_', newFileName )
76

    
77
def getCurrentFolder(currentFolder):
78
	if not currentFolder:
79
		currentFolder = '/'
80

    
81
	# Check the current folder syntax (must begin and end with a slash).
82
	if (currentFolder[-1] <> "/"):
83
		currentFolder += "/"
84
	if (currentFolder[0] <> "/"):
85
		currentFolder = "/" + currentFolder
86

    
87
	# Ensure the folder path has no double-slashes
88
	while '//' in currentFolder:
89
		currentFolder = currentFolder.replace('//','/')
90

    
91
	# Check for invalid folder paths (..)
92
	if '..' in currentFolder or '\\' in currentFolder:
93
		return None
94

    
95
	# Check for invalid folder paths (..)
96
	if re.search( '(/\\.)|(//)|([\\\\:\\*\\?\\""\\<\\>\\|]|[\x00-\x1F]|[\x7f-\x9f])', currentFolder ):
97
		return None
98

    
99
	return currentFolder
100

    
101
def mapServerPath( environ, url):
102
	" Emulate the asp Server.mapPath function. Given an url path return the physical directory that it corresponds to "
103
	# This isn't correct but for the moment there's no other solution
104
	# If this script is under a virtual directory or symlink it will detect the problem and stop
105
	return combinePaths( getRootPath(environ), url )
106

    
107
def mapServerFolder(resourceTypePath, folderPath):
108
	return combinePaths ( resourceTypePath  , folderPath )
109

    
110
def getRootPath(environ):
111
	"Purpose: returns the root path on the server"
112
	# WARNING: this may not be thread safe, and doesn't work w/ VirtualServer/mod_python
113
	# Use Config.UserFilesAbsolutePath instead
114

    
115
	if environ.has_key('DOCUMENT_ROOT'):
116
		return environ['DOCUMENT_ROOT']
117
	else:
118
		realPath = os.path.realpath( './' )
119
		selfPath = environ['SCRIPT_FILENAME']
120
		selfPath = selfPath [ :  selfPath.rfind( '/'  ) ]
121
		selfPath = selfPath.replace( '/', os.path.sep)
122

    
123
		position = realPath.find(selfPath)
124

    
125
		# This can check only that this script isn't run from a virtual dir
126
		# But it avoids the problems that arise if it isn't checked
127
		raise realPath
128
		if ( position < 0 or position <> len(realPath) - len(selfPath) or realPath[ : position ]==''):
129
			raise Exception('Sorry, can\'t map "UserFilesPath" to a physical path. You must set the "UserFilesAbsolutePath" value in "editor/filemanager/connectors/py/config.py".')
130
		return realPath[ : position ]
(6-6/10)