1 /***************************************************************************
2 sftpProtocol.h - description
4 begin : Sat Jun 30 20:08:47 CDT 2001
5 copyright : (C) 2001 by Lucas Fisher
6 email : ljfisher@purdue.edu
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
17 #ifndef __kio_sftp_h__
18 #define __kio_sftp_h__
24 #include <kio/global.h>
25 #include <kio/slavebase.h>
29 #include "sftpfileattr.h"
30 #include "ksshprocess.h"
32 #define KIO_SFTP_DB 7120
35 class sftpProtocol
: public KIO::SlaveBase
39 sftpProtocol(const QByteArray
&pool_socket
, const QByteArray
&app_socket
);
40 virtual ~sftpProtocol();
41 virtual void setHost(const QString
& h
, quint16 port
, const QString
& user
, const QString
& pass
);
42 virtual void get(const KUrl
& url
);
43 virtual void listDir(const KUrl
& url
) ;
44 virtual void mimetype(const KUrl
& url
);
45 virtual void stat(const KUrl
& url
);
46 virtual void copy(const KUrl
&src
, const KUrl
&dest
, int permissions
, KIO::JobFlags flags
);
47 virtual void put(const KUrl
& url
, int permissions
, KIO::JobFlags flags
);
48 virtual void closeConnection();
49 virtual void slave_status();
50 virtual void del(const KUrl
&url
, bool isfile
);
51 virtual void chmod(const KUrl
& url
, int permissions
);
52 virtual void symlink(const QString
& target
, const KUrl
& dest
, KIO::JobFlags flags
);
53 virtual void rename(const KUrl
& src
, const KUrl
& dest
, KIO::JobFlags flags
);
54 virtual void mkdir(const KUrl
&url
, int permissions
);
55 virtual void openConnection();
57 // KIO::FileJob interface
58 virtual void open(const KUrl
&url
, QIODevice::OpenMode mode
);
59 virtual void read(KIO::filesize_t size
);
60 virtual void write(const QByteArray
&data
);
61 virtual void seek(KIO::filesize_t offset
);
64 private: // Private variables
65 /** True if ioslave is connected to sftp server. */
68 /** Host we are connected to. */
71 /** Port we are connected to. */
74 /** Ssh process to which we send the sftp packets. */
77 /** Username to use when connecting */
80 /** User's password */
83 /** Message id of the last sftp packet we sent. */
86 /** Type of packet we are expecting to receive next. */
87 unsigned char mExpected
;
89 /** Version of the sftp protocol we are using. */
99 // KIO::FileJob interface
100 /** The opened handle */
101 QByteArray openHandle
;
103 KIO::filesize_t openOffset
;
105 private: // private methods
106 bool getPacket(QByteArray
& msg
);
108 /* Type is a sftp packet type found in .sftp.h'.
109 * Example: SSH2_FXP_READLINK, SSH2_FXP_RENAME, etc.
111 * Returns true if the type is supported by the sftp protocol
112 * version negotiated by the client and server (sftpVersion).
114 bool isSupportedOperation(int type
);
115 /** Used to have the server canonicalize any given path name to an absolute path.
116 This is useful for converting path names containing ".." components or relative
117 pathnames without a leading slash into absolute paths.
118 Returns the canonicalized url. */
119 int sftpRealPath(const KUrl
& url
, KUrl
& newUrl
);
121 /** Send an sftp packet to stdin of the ssh process. */
122 bool putPacket(QByteArray
& p
);
123 /** Process SSH_FXP_STATUS packets. */
124 void processStatus(quint8
, const QString
& message
= QString());
125 /** Process SSH_FXP_STATUS packes and return the result. */
126 Status
doProcessStatus(quint8
, const QString
& message
= QString());
127 /** Opens a directory handle for url.path. Returns true if succeeds. */
128 int sftpOpenDirectory(const KUrl
& url
, QByteArray
& handle
);
129 /** Closes a directory or file handle. */
130 int sftpClose(const QByteArray
& handle
);
131 /** Send a sftp command to rename a file or directory. */
132 int sftpRename(const KUrl
& src
, const KUrl
& dest
);
133 /** Set a files attributes. */
134 int sftpSetStat(const KUrl
& url
, const sftpFileAttr
& attr
);
135 /** Sends a sftp command to remove a file or directory. */
136 int sftpRemove(const KUrl
& url
, bool isfile
);
137 /** Creates a symlink named dest to target. */
138 int sftpSymLink(const QString
& target
, const KUrl
& dest
);
139 /** Get directory listings. */
140 int sftpReadDir(const QByteArray
& handle
, const KUrl
& url
);
141 /** Retrieves the destination of a link. */
142 int sftpReadLink(const KUrl
& url
, QString
& target
);
144 int sftpStat(const KUrl
& url
, sftpFileAttr
& attr
);
145 /** No descriptions */
146 int sftpOpen(const KUrl
& url
, const quint32 pflags
, const sftpFileAttr
& attr
, QByteArray
& handle
);
147 /** No descriptions */
148 int sftpRead(const QByteArray
& handle
, KIO::filesize_t offset
, quint32 len
, QByteArray
& data
);
149 /** No descriptions */
150 int sftpWrite(const QByteArray
& handle
, KIO::filesize_t offset
, const QByteArray
& data
);
152 /** Performs faster upload when the source is a local file... */
153 void sftpCopyPut(const KUrl
& src
, const KUrl
& dest
, int mode
, KIO::JobFlags flags
);
154 /** Performs faster download when the destination is a local file... */
155 void sftpCopyGet(const KUrl
& dest
, const KUrl
& src
, int mode
, KIO::JobFlags flags
);
157 /** Read a file. This is used by get(), copy(), and mimetype(). */
158 Status
sftpGet( const KUrl
& src
, KIO::filesize_t offset
= 0, int fd
= -1, bool abortAfterMimeType
= false);
160 void sftpPut( const KUrl
& dest
, int permissions
, KIO::JobFlags flags
, int fd
= -1);