/* * Copyright (c) 2001 Lucas Fisher <ljfisher@purdue.edu> * Copyright (c) 2009 Andreas Schneider <mail@cynapses.org> * Copyright (c) 2020 Martin Sandsmark <martin@sandsmark.ninja> * KDE2 port * Copyright (c) 2022 Mavridis Philippe <mavridisf@gmail.com> * Trinity port * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later * version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __tdeio_sftp_h__ #define __tdeio_sftp_h__ #include <kurl.h> #include <tdeio/global.h> #include <tdeio/slavebase.h> #include <kdebug.h> #include <stdint.h> #include <libssh/libssh.h> #include <libssh/sftp.h> #include <libssh/callbacks.h> // How big should each data packet be? Definitely not bigger than 64kb or // you will overflow the 2 byte size variable in a sftp packet. #define MAX_XFER_BUF_SIZE 60 * 1024 #define TDEIO_SFTP_DB 7120 #if LIBSSH_VERSION_INT < SSH_VERSION_INT(0, 7, 90) #define TDEIO_SSH_KNOWN_HOSTS_OK SSH_SERVER_KNOWN_OK #define TDEIO_SSH_KNOWN_HOSTS_OTHER SSH_SERVER_FOUND_OTHER #define TDEIO_SSH_KNOWN_HOSTS_CHANGED SSH_SERVER_KNOWN_CHANGED #define TDEIO_SSH_KNOWN_HOSTS_NOT_FOUND SSH_SERVER_FILE_NOT_FOUND #define TDEIO_SSH_KNOWN_HOSTS_UNKNOWN SSH_SERVER_NOT_KNOWN #define TDEIO_SSH_KNOWN_HOSTS_ERROR SSH_SERVER_ERROR #else #define TDEIO_SSH_KNOWN_HOSTS_OK SSH_KNOWN_HOSTS_OK #define TDEIO_SSH_KNOWN_HOSTS_OTHER SSH_KNOWN_HOSTS_OTHER #define TDEIO_SSH_KNOWN_HOSTS_CHANGED SSH_KNOWN_HOSTS_CHANGED #define TDEIO_SSH_KNOWN_HOSTS_NOT_FOUND SSH_KNOWN_HOSTS_NOT_FOUND #define TDEIO_SSH_KNOWN_HOSTS_UNKNOWN SSH_KNOWN_HOSTS_UNKNOWN #define TDEIO_SSH_KNOWN_HOSTS_ERROR SSH_KNOWN_HOSTS_ERROR #endif namespace TDEIO { class AuthInfo; } class sftpProtocol : public TDEIO::SlaveBase { public: sftpProtocol(const TQCString &pool_socket, const TQCString &app_socket); virtual ~sftpProtocol(); virtual void setHost(const TQString& h, int port, const TQString& user, const TQString& pass) override; virtual void get(const KURL& url) override; virtual void listDir(const KURL& url) override; virtual void mimetype(const KURL& url) override; virtual void stat(const KURL& url) override; virtual void put(const KURL& url, int permissions, bool overwrite, bool resume) override; virtual void copy(const KURL &src, const KURL &dest, int permissions, bool overwrite) override; virtual void closeConnection() override; virtual void slave_status() override; virtual void del(const KURL &url, bool isfile) override; virtual void chmod(const KURL& url, int permissions) override; virtual void symlink(const TQString& target, const KURL& dest, bool overwrite) override; virtual void rename(const KURL& src, const KURL& dest, bool overwrite) override; virtual void mkdir(const KURL& url, int permissions) override; virtual void openConnection() override; // libssh authentication callback (note that this is called by the // global ::auth_callback() call. int auth_callback(const char *prompt, char *buf, size_t len, int echo, int verify, void *userdata); // libssh logging callback (note that this is called by the // global ::log_callback() call. void log_callback(ssh_session session, int priority, const char *message, void *userdata); private: // Private variables void statMime(const KURL &url); void closeFile(); /** True if ioslave is connected to sftp server. */ bool mConnected; /** Host we are connected to. */ TQString mHost; /** Port we are connected to. */ int mPort; /** The ssh session for the connection */ ssh_session mSession; /** The sftp session for the connection */ sftp_session mSftp; /** Username to use when connecting */ TQString mUsername; /** User's password */ TQString mPassword; /** The open file */ sftp_file mOpenFile; /** The open URL */ KURL mOpenUrl; ssh_callbacks mCallbacks; /** Version of the sftp protocol we are using. */ int sftpVersion; //struct Status //{ // int code; // TDEIO::filesize_t size; // TQString text; //}; TDEIO::AuthInfo *pubKeyInfo; private: // private methods int authenticateKeyboardInteractive(TDEIO::AuthInfo &info); void clearPubKeyAuthInfo(); void reportError(const KURL &url, const int err); bool createUDSEntry(const TQString &filename, const TQByteArray &path, TDEIO::UDSEntry &entry, short int details); TQString canonicalizePath(const TQString &path); }; #endif