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)
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
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.')
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
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.')