mirror of
https://github.com/VTECRM/vtenext.git
synced 2026-02-27 00:28:47 +00:00
291 lines
8.0 KiB
Python
291 lines
8.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import with_statement # This isn't required in Python 2.6
|
|
__metaclass__ = type
|
|
|
|
|
|
from contextlib import closing, contextmanager
|
|
import os, sys, 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.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:
|
|
thefile = util.FieldStorage(req)['file'] #TODO get the correct param name for the field holding the file
|
|
newName = thefile.filename
|
|
|
|
with open(newName, 'rb') as f:
|
|
f.write(thefile.value)
|
|
|
|
except:
|
|
|
|
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:
|
|
|
|
result = {
|
|
'Path' : path,
|
|
'Name' : newName,
|
|
'Error' : 'There was an error creating the directory.' # TODO grab the actual traceback.
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
myFilemanager = Filemanager(fileroot='/var/www/html/dev/fmtest/UserFiles/') #modify fileroot as a needed
|
|
|
|
|
|
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, (errno, strerror):
|
|
apache.log_error(strerror, apache.APLOG_CRIT)
|
|
return apache.HTTP_INTERNAL_SERVER_ERROR
|
|
|
|
#os.setuid(oldid)
|
|
|