Repository URL to install this package:
|
Version:
4.0.115 ▾
|
# -*- coding: utf-8 -*-
# This isn't required in Python 2.6
__metaclass__ = type
from contextlib import closing, contextmanager
import os
import sys
import traceback
import os.path
from mod_python import apache, util
from util import parse_qs
today = date.today
ver = sys.version_info
if ver[0] < 2 and ver[1] < 5:
raise EnvironmentError('Must have Python version 2.5 or higher.')
try:
import json
except ImportError:
raise EnvironmentError(
'Must have the json module. (It is included in Python 2.6 or can be installed on version 2.5.)')
try:
from PIL import Image
except ImportError:
raise EnvironmentError('Must have the PIL (Python Imaging Library).')
path_exists = os.path.exists
normalize_path = os.path.normpath
absolute_path = os.path.abspath
make_url = urlparse.urljoin
split_path = os.path.split
split_ext = os.path.splitext
euncode_urlpath = urllib.parse.quote_plus
encode_json = json.JSONEcoder().encode
def encodeURLsafeBase64(data):
return base64.urlsafe_b64encode(data).replace('=', '').replace(r'\x0A', '')
def image(*args):
raise NotImplementedError
class Filemanager:
"""Replacement for FCKEditor's built-in file manager."""
def __init__(self, fileroot='/'):
self.fileroot = fileroot
self.patherror = encode_json(
{
'Error': 'No permission to operate on specified path.',
'Code': -1
}
)
def isvalidrequest(self, **kwargs):
"""Returns an error if the given path is not within the specified root path."""
assert split_path(kwargs['path'])[0] == self.fileroot
assert not kwargs['req'] is None
def getinfo(self, path=None, getsize=true, req=None):
"""Returns a JSON object containing information about the given file."""
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
thefile = {
'Filename': split_path(path)[-1],
'File Type': '',
'Preview': path if split_path(path)[-1] else 'images/fileicons/_Open.png',
'Path': path,
'Error': '',
'Code': 0,
'Properties': {
'Date Created': '',
'Date Modified': '',
'Width': '',
'Height': '',
'Size': ''
}
}
imagetypes = set('gif', 'jpg', 'jpeg', 'png')
if not path_exists(path):
thefile['Error'] = 'File does not exist.'
return (encode_json(thefile), None, 'application/json')
if split_path(path)[-1] == '/':
thefile['File Type'] = 'Directory'
else:
thefile['File Type'] = split_ext(path)
if ext in imagetypes:
img = Image(path).size()
thefile['Properties']['Width'] = img[0]
thefile['Properties']['Height'] = img[1]
else:
previewPath = 'images/fileicons/' + ext.upper + '.png'
thefile['Preview'] = previewPath if path_exists(
'../../' + previewPath) else 'images/fileicons/default.png'
thefile['Properties']['Date Created'] = os.path.getctime(path)
thefile['Properties']['Date Modified'] = os.path.getmtime(path)
thefile['Properties']['Size'] = os.path.getsize(path)
req.content_type('application/json')
req.write(encode_json(thefile))
def getfolder(self, path=None, getsizes=true, req=None):
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
result = []
filtlist = file_listdirectory(path)
for i in filelist:
if i[0] == '.':
result += literal(self.getinfo(path + i, getsize=getsizes))
req.content_type('application/json')
req.write(encode_json(result))
def rename(self, old=None, new=None, req=None):
if not self.isvalidrequest(path=new, req=req):
return (self.patherror, None, 'application/json')
if old[-1] == '/':
old = old[:-1]
oldname = split_path(path)[-1]
path = string(old)
path = split_path(path)[0]
if not path[-1] == '/':
path += '/'
newname = encode_urlpath(new)
newpath = path + newname
os.path.rename(old, newpath)
result = {
'Old Path': old,
'Old Name': oldname,
'New Path': newpath,
'New Name': newname,
'Error': 'There was an error renaming the file.' # todo: get the actual error
}
req.content_type('application/json')
req.write(encode_json(result))
def delete(self, path=None, req=None):
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
os.path.remove(path)
result = {
'Path': path,
'Error': 'There was an error renaming the file.' # todo: get the actual error
}
req.content_type('application/json')
req.write(encode_json(result))
def add(self, path=None, req=None):
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
try:
# TODO get the correct param name for the field holding the file
thefile = util.FieldStorage(req)['file']
newName = thefile.filename
with open(newName, 'rb') as f:
f.write(thefile.value)
except BaseException:
result = {
'Path': path,
'Name': newName,
'Error': file_currenterror
}
else:
result = {
'Path': path,
'Name': newName,
'Error': 'No file was uploaded.'
}
req.content_type('text/html')
req.write(('<textarea>' + encode_json(result) + '</textarea>'))
def addfolder(self, path, name):
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
newName = encode_urlpath(name)
newPath = path + newName + '/'
if not path_exists(newPath):
try:
os.mkdir(newPath)
except BaseException:
result = {
'Path': path,
'Name': newName,
# TODO grab the actual traceback.
'Error': 'There was an error creating the directory.'
}
def download(self, path=None, req=None):
if not self.isvalidrequest(path, req):
return (self.patherror, None, 'application/json')
name = path.split('/')[-1]
req.content_type('application/x-download')
req.filename = name
req.sendfile(path)
# modify fileroot as a needed
myFilemanager = Filemanager(fileroot='/var/www/html/dev/fmtest/UserFiles/')
def handler(req):
#req.content_type = 'text/plain'
#req.write("Hello World!")
if req.method == 'POST':
kwargs = parse_qs(req.read())
elif req.method == 'GET':
kwargs = parse_qs(req.args)
#oldid = os.getuid()
# os.setuid(501)
try:
method = str(kwargs['mode'][0])
methodKWargs = kwargs.remove('mode')
methodKWargs['req'] = req
myFilemanager.__dict__['method'](**methodKWargs)
return apache.OK
except KeyError:
return apache.HTTP_BAD_REQUEST
except Exception as xxx_todo_changeme:
(errno, strerror) = xxx_todo_changeme.args
apache.log_error(strerror, apache.APLOG_CRIT)
return apache.HTTP_INTERNAL_SERVER_ERROR
# os.setuid(oldid)