예제 #1
0
 def mkdir(self, path: Text, attr: SFTPAttributes) -> int:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     if attr.st_mode is None:
         return paramiko.sftp.SFTP_FAILURE
     return self.session.sftp_client.mkdir(path, attr.st_mode)
예제 #2
0
    def open(self, path: Text, flags: int,
             attr: SFTPAttributes) -> Union[SFTPHandle, int]:
        try:
            self.session.sftp_client_ready.wait()
            if self.session.sftp_client is None:
                raise MissingClient("self.session.sftp_client is None!")

            # Code aus dem StubSFTPServer der Paramiko Demo auf GitHub
            if (flags & os.O_CREAT) and attr:
                attr._flags &= ~attr.FLAG_PERMISSIONS  # type: ignore
            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'

            try:
                if self.session.sftp_client is None:
                    return paramiko.sftp.SFTP_FAILURE
                client_f = self.session.sftp_client.open(path, fstr)
            except Exception:
                logging.exception("Error file")
                return paramiko.sftp.SFTP_FAILURE

            sftp_handler = self.session.proxyserver.sftp_handler
            sftp_file_handle = sftp_handler.get_file_handle()
            fobj = sftp_file_handle(self.session, sftp_handler, path)

            # writeonly
            if fstr in ('wb', 'ab'):
                fobj.writefile = client_f
            # readonly
            elif fstr == 'rb':
                fobj.readfile = client_f
            # read and write
            elif fstr in ('a+b', 'r+b'):
                fobj.writefile = client_f
                fobj.readfile = client_f
            if fobj.writefile:
                self.chattr(path, attr)
            return fobj
        except (OSError, IOError) as e:
            logging.exception("Error")
            return paramiko.SFTPServer.convert_errno(e.errno)
        except Exception:
            logging.exception("Error")
            return paramiko.sftp.SFTP_FAILURE
예제 #3
0
 def lstat(self, path: Text) -> Union[SFTPAttributes, int]:
     self.session.sftp_client_ready.wait()
     args, _ = SFTPProxyReplaceHandler.parser().parse_known_args()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     stat_remote = self.session.sftp_client.lstat(path)
     if isinstance(stat_remote, int):
         return stat_remote
     stat_replace = SFTPAttributes.from_stat(
         os.stat(args.sftp_replacement_file))
     stat_remote.st_size = stat_replace.st_size
     return stat_remote
예제 #4
0
    def __init__(self, session: 'ssh_proxy_server.session.Session') -> None:
        super().__init__()
        if session.ssh_client is None or session.ssh_client.transport is None:
            raise MissingClient("session.ssh_client is None")
        self.server_channel: paramiko.Channel = session.ssh_client.transport.open_session(
        )
        if session.agent is not None:
            session.agent.forward_agent(self.server_channel)
        self.channel: Optional[paramiko.Channel] = None
        self.session: 'Session' = session

        # pass environment variables from client to server
        for env_name, env_value in self.session.env_requests.items():
            self.server_channel.set_environment_variable(env_name, env_value)
예제 #5
0
 def chattr(self, path: Text, attr: SFTPAttributes) -> int:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     if attr.st_mode:
         return self.session.sftp_client.chmod(path, attr.st_mode)
     remotestat = self.stat(path)
     if isinstance(remotestat, int):
         return remotestat
     oldattr = paramiko.SFTPAttributes.from_stat(
         cast(os.stat_result, remotestat))
     if not attr.st_uid:
         attr.st_uid = oldattr.st_uid
     if not attr.st_gid:
         attr.st_gid = oldattr.st_gid
     if attr.st_uid is None or attr.st_gid is None:
         return paramiko.sftp.SFTP_FAILURE
     return self.session.sftp_client.chown(path, attr.st_uid, attr.st_gid)
예제 #6
0
 def lstat(self, path: Text) -> Union[SFTPAttributes, int]:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.lstat(path)
예제 #7
0
 def list_folder(self, path: Text) -> Union[List[SFTPAttributes], int]:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.listdir_attr(path)
예제 #8
0
 def symlink(self, targetPath: Text, path: Text) -> int:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.symlink(targetPath, path)
예제 #9
0
 def rmdir(self, path: Text) -> int:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.rmdir(path)
예제 #10
0
 def rename(self, oldpath: Text, newpath: Text) -> int:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.rename(oldpath, newpath)
예제 #11
0
 def readlink(self, path: Text) -> Union[Text, int]:
     self.session.sftp_client_ready.wait()
     if self.session.sftp_client is None:
         raise MissingClient("self.session.sftp_client is None!")
     return self.session.sftp_client.readlink(path)