コード例 #1
0
 def _open_folder(self, request_number, path):
     resp = self.server.list_folder(path)
     if issubclass(type(resp), list):
         # got an actual list of filenames in the folder
         folder = SFTPHandle()
         folder._set_files(resp)
         self._send_handle_response(request_number, folder, True)
         return
     # must be an error code
     self._send_status(request_number, resp)
コード例 #2
0
ファイル: sftp_server.py プロジェクト: anandu/pylibs
 def _open_folder(self, request_number, path):
     resp = self.server.list_folder(path)
     if issubclass(type(resp), list):
         # got an actual list of filenames in the folder
         folder = SFTPHandle()
         folder._set_files(resp)
         self._send_handle_response(request_number, folder, True)
         return
     # must be an error code
     self._send_status(request_number, resp)
コード例 #3
0
    def open(self, path, flags, attr):
        print 'OPENING'
        permissions = self._get_bioshare_path_permissions(path)
        IS_WRITE = flags & os.O_CREAT or flags & os.O_WRONLY or flags & os.O_RDWR or flags & os.O_APPEND
        if not ((not IS_WRITE and Share.PERMISSION_VIEW in permissions and Share.PERMISSION_DOWNLOAD in permissions) or  (IS_WRITE and Share.PERMISSION_WRITE in permissions and Share.PERMISSION_VIEW in permissions)):
#         if Share.PERMISSION_WRITE not in permissions:
            raise PermissionDenied()
        if flags & os.O_CREAT or flags & os.O_WRONLY or flags & os.O_RDWR or flags & os.O_APPEND:
            self._path_modified(path)
        path = self._realpath(path)
        try:
            binary_flag = getattr(os, 'O_BINARY', 0)
            flags |= binary_flag
            mode = getattr(attr, 'st_mode', None)
            if mode is not None:
                fd = os.open(path, flags, mode)
            else:
                # os.open() defaults to 0777 which is
                # an odd default mode for files
                fd = os.open(path, flags, o666)
        except OSError as e:
            return SFTPServer.convert_errno(e.errno)
        try:
            if (flags & os.O_CREAT) and (attr is not None):
                attr._flags &= ~attr.FLAG_PERMISSIONS
                SFTPServer.set_file_attr(path, attr)
            if flags & os.O_WRONLY:
                if flags & os.O_APPEND:
                    fstr = 'ab'
                else:
                    fstr = 'wb'
            elif flags & os.O_RDWR:
                if flags & os.O_APPEND:
                    fstr = 'a+b'
                else:
                    fstr = 'r+b'
            else:
                # O_RDONLY (== 0)
                fstr = 'rb'
        except Exception as e:
            print e.message
        try:
            f = os.fdopen(fd, fstr)
        except OSError as e:
            return SFTPServer.convert_errno(e.errno)
        fobj = SFTPHandle(flags,permissions=permissions)
        fobj.filename = path
        fobj.readfile = f
        fobj.writefile = f
        return fobj
コード例 #4
0
                    val.update( {
                        'res_model': object2._name,
                        'partner_id': partner,
                        'res_id': object2.id
                    })
                cid = fobj.create(cr, uid, val, context={})
            cr.commit()
            cr.close()
            f = file_wrapper('', cid, cr.dbname, uid, )

        except Exception,e:
            log(e)
            raise OSError(1, 'Operation not permited.')
        
        if f :
            fobj = SFTPHandle(flags)
            fobj.filename =  objname
            fobj.readfile = None
            fobj.writefile = f
            return fobj
        return False

    def remove(self, node):
        """ Remove  """
        assert node
        if node.type == 'collection':
            return self.rmdir(node)
        elif node.type == 'file':
            return self.rmfile(node)
        raise OSError(1, 'Operation not permited.')
コード例 #5
0
class SFTPServer(paramiko.SFTPServerInterface):
    db_name_list = []

    def __init__(self, server, *largs, **kwargs):
        self.server = server
        self.ROOT = '/'

    def fs2ftp(self, node):
        res = '/'
        if node:
            res = os.path.normpath(node.path)
            res = res.replace("\\", "/")
            while res[:2] == '//':
                res = res[1:]
            res = '/' + node.cr.dbname + '/' + res
        res = _to_decode(res)
        return res

    def ftp2fs(self, path, data):
        if not data or (path and (path in ('/', '.'))):
            return None
        path = _to_unicode(path)
        path2 = filter(None, path.split('/'))[1:]
        (cr, uid, pool) = data
        res = pool.get('document.directory').get_object(cr, uid, path2[:])
        if not res:
            raise OSError(2, 'Not such file or directory.')
        return res

    def get_cr(self, path):
        path = _to_unicode(path)
        if path and path in ('/', '.'):
            return None
        dbname = path.split('/')[1]
        try:
            if not len(self.db_name_list):
                self.db_name_list = self.db_list()
            if dbname not in self.db_name_list:
                return None
            db, pool = pooler.get_db_and_pool(dbname)
        except:
            raise OSError(1, 'Operation not permited.')
        cr = db.cursor()
        uid = self.server.check_security(dbname, self.server.username,
                                         self.server.key)
        if not uid:
            raise OSError(2, 'Authentification Required.')
        return cr, uid, pool

    def close_cr(self, data):
        if data:
            data[0].close()
        return True

    def open(self, node, flags, attr):
        try:
            if not node:
                raise OSError(1, 'Operation not permited.')
            cr = pooler.get_db(node.context.dbname).cursor()
            uid = node.context.uid
            if node.type == 'file':
                if not self.isfile(node):
                    raise OSError(1, 'Operation not permited.')
                att_obj = node.context._dirobj.pool.get('ir.attachment')
                fobj = att_obj.browse(cr, uid, node.file_id, \
                                  context=node.context.context)
                if fobj.store_method and fobj.store_method == 'fs':
                    f = StringIO.StringIO(node.get_data(cr, fobj))
                else:
                    f = StringIO.StringIO(base64.decodestring(fobj.datas
                                                              or ''))
            elif node.type == 'content':
                pool = pooler.get_pool(cr.dbname)
                res = getattr(pool.get('document.directory.content'),
                              'process_read')(cr, uid, node)
                f = StringIO.StringIO(res)
            else:
                raise OSError(1, 'Operation not permited.')
        except OSError, e:
            return paramiko.SFTPServer.convert_errno(e.errno)

        sobj = SFTPHandle(flags)
        sobj.filename = node.path
        sobj.readfile = f
        sobj.writefile = None
        cr.close()
        return sobj
コード例 #6
0
                cid = fobj.create(cr, uid, val, context={})
            cr.commit()
            cr.close()
            f = file_wrapper(
                '',
                cid,
                cr.dbname,
                uid,
            )

        except Exception, e:
            log(e)
            raise OSError(1, 'Operation not permited.')

        if f:
            fobj = SFTPHandle(flags)
            fobj.filename = objname
            fobj.readfile = None
            fobj.writefile = f
            return fobj
        return False

    def remove(self, node):
        """ Remove  """
        assert node
        if node.type == 'collection':
            return self.rmdir(node)
        elif node.type == 'file':
            return self.rmfile(node)
        raise OSError(1, 'Operation not permited.')