summaryrefslogtreecommitdiff
path: root/libssh2
diff options
context:
space:
mode:
Diffstat (limited to 'libssh2')
-rw-r--r--libssh2/libssh2_wrap.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/libssh2/libssh2_wrap.h b/libssh2/libssh2_wrap.h
new file mode 100644
index 00000000..37a62a24
--- /dev/null
+++ b/libssh2/libssh2_wrap.h
@@ -0,0 +1,231 @@
+// *****************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 *
+// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved *
+// *****************************************************************************
+
+#ifndef LIBSSH2_WRAP_H_087280957180967346572465
+#define LIBSSH2_WRAP_H_087280957180967346572465
+
+#include <zen/scope_guard.h>
+#include <zen/string_tools.h>
+
+
+
+//-------------------------------------------------
+#include <libssh2_sftp.h>
+//-------------------------------------------------
+
+#ifndef LIBSSH2_SFTP_H
+ #error libssh2_sftp.h header guard changed
+#endif
+
+//fix libssh2 64-bit warning mess: https://github.com/libssh2/libssh2/pull/96
+#undef libssh2_userauth_password
+inline int libssh2_userauth_password(LIBSSH2_SESSION* session, const std::string& username, const std::string& password)
+{
+ return libssh2_userauth_password_ex(session,
+ username.c_str(), static_cast<unsigned int>(username.size()),
+ password.c_str(), static_cast<unsigned int>(password.size()), nullptr);
+}
+
+#undef libssh2_userauth_keyboard_interactive
+inline int libssh2_userauth_keyboard_interactive(LIBSSH2_SESSION* session, const std::string& username, LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)))
+{
+ return libssh2_userauth_keyboard_interactive_ex(session, username.c_str(), static_cast<unsigned int>(username.size()), response_callback);
+}
+
+inline char* libssh2_userauth_list(LIBSSH2_SESSION* session, const std::string& username)
+{
+ return libssh2_userauth_list(session, username.c_str(), static_cast<unsigned int>(username.size()));
+}
+
+
+inline int libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION* session, const std::string& username, const std::string& privateKeyStream, const std::string& passphrase)
+{
+ return libssh2_userauth_publickey_frommemory(session, username.c_str(), username.size(), nullptr, 0,
+ privateKeyStream.c_str(), privateKeyStream.size(), passphrase.c_str());
+}
+
+#undef libssh2_sftp_opendir
+inline LIBSSH2_SFTP_HANDLE* libssh2_sftp_opendir(LIBSSH2_SFTP* sftp, const std::string& path)
+{
+ return libssh2_sftp_open_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), 0, 0, LIBSSH2_SFTP_OPENDIR);
+}
+
+#undef libssh2_sftp_stat
+inline int libssh2_sftp_stat(LIBSSH2_SFTP* sftp, const std::string& path, LIBSSH2_SFTP_ATTRIBUTES* attrs)
+{
+ return libssh2_sftp_stat_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), LIBSSH2_SFTP_STAT, attrs);
+}
+
+#undef libssh2_sftp_open
+inline LIBSSH2_SFTP_HANDLE* libssh2_sftp_open(LIBSSH2_SFTP* sftp, const std::string& path, unsigned long flags, long mode)
+{
+ return libssh2_sftp_open_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), flags, mode, LIBSSH2_SFTP_OPENFILE);
+}
+
+#undef libssh2_sftp_setstat
+inline int libssh2_sftp_setstat(LIBSSH2_SFTP* sftp, const std::string& path, LIBSSH2_SFTP_ATTRIBUTES* attrs)
+{
+ return libssh2_sftp_stat_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), LIBSSH2_SFTP_SETSTAT, attrs);
+}
+
+#undef libssh2_sftp_lstat
+inline int libssh2_sftp_lstat(LIBSSH2_SFTP* sftp, const std::string& path, LIBSSH2_SFTP_ATTRIBUTES* attrs)
+{
+ return libssh2_sftp_stat_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), LIBSSH2_SFTP_LSTAT, attrs);
+}
+
+#undef libssh2_sftp_mkdir
+inline int libssh2_sftp_mkdir(LIBSSH2_SFTP* sftp, const std::string& path, long mode)
+{
+ return libssh2_sftp_mkdir_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), mode);
+}
+
+#undef libssh2_sftp_unlink
+inline int libssh2_sftp_unlink(LIBSSH2_SFTP* sftp, const std::string& path)
+{
+ return libssh2_sftp_unlink_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()));
+}
+
+#undef libssh2_sftp_rmdir
+inline int libssh2_sftp_rmdir(LIBSSH2_SFTP* sftp, const std::string& path)
+{
+ return libssh2_sftp_rmdir_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()));
+}
+
+#undef libssh2_sftp_realpath
+inline int libssh2_sftp_realpath(LIBSSH2_SFTP* sftp, const std::string& path, char* buf, size_t bufSize)
+{
+ return libssh2_sftp_symlink_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), buf, static_cast<unsigned int>(bufSize), LIBSSH2_SFTP_REALPATH);
+}
+
+#undef libssh2_sftp_readlink
+inline int libssh2_sftp_readlink(LIBSSH2_SFTP* sftp, const std::string& path, char* buf, size_t bufSize)
+{
+ return libssh2_sftp_symlink_ex(sftp, path.c_str(), static_cast<unsigned int>(path.size()), buf, static_cast<unsigned int>(bufSize), LIBSSH2_SFTP_READLINK);
+}
+
+#undef libssh2_sftp_rename
+inline int libssh2_sftp_rename(LIBSSH2_SFTP* sftp, const std::string& pathFrom, const std::string& pathTo, long flags)
+{
+ return libssh2_sftp_rename_ex(sftp,
+ pathFrom.c_str(), static_cast<unsigned int>(pathFrom.size()),
+ pathTo.c_str(), static_cast<unsigned int>(pathTo.size()), flags);
+}
+
+
+
+namespace zen
+{
+namespace
+{
+std::wstring formatSshStatusCode(int sc)
+{
+ switch (sc)
+ {
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_NONE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SOCKET_NONE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BANNER_RECV);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BANNER_SEND);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_INVALID_MAC);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEX_FAILURE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ALLOC);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SOCKET_SEND);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_TIMEOUT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_HOSTKEY_INIT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_HOSTKEY_SIGN);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_DECRYPT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SOCKET_DISCONNECT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_PROTO);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_PASSWORD_EXPIRED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_FILE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_METHOD_NONE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_AUTHENTICATION_FAILED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_OUTOFORDER);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_FAILURE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_UNKNOWN);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_CLOSED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_EOF_SENT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SCP_PROTOCOL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ZLIB);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SOCKET_TIMEOUT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SFTP_PROTOCOL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_REQUEST_DENIED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_METHOD_NOT_SUPPORTED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_INVAL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_INVALID_POLL_TYPE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_PUBLICKEY_PROTOCOL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_EAGAIN);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BUFFER_TOO_SMALL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BAD_USE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_COMPRESS);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_OUT_OF_BOUNDARY);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_AGENT_PROTOCOL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_SOCKET_RECV);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_ENCRYPT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_BAD_SOCKET);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KNOWN_HOSTS);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_CHANNEL_WINDOW_FULL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_ERROR_KEYFILE_AUTH_FAILED);
+ }
+ return replaceCpy<std::wstring>(L"SSH status %x.", L"%x", numberTo<std::wstring>(sc));
+}
+
+
+std::wstring formatSftpStatusCode(unsigned long sc)
+{
+ switch (sc)
+ {
+ //*INDENT-OFF*
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_OK);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_EOF);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NO_SUCH_FILE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_PERMISSION_DENIED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_FAILURE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_BAD_MESSAGE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NO_CONNECTION);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_CONNECTION_LOST);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_OP_UNSUPPORTED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_INVALID_HANDLE);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NO_SUCH_PATH);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_FILE_ALREADY_EXISTS);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_WRITE_PROTECT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NO_MEDIA);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_QUOTA_EXCEEDED);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_UNKNOWN_PRINCIPAL);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_LOCK_CONFLICT);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_DIR_NOT_EMPTY);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_NOT_A_DIRECTORY);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_INVALID_FILENAME);
+ ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_LINK_LOOP);
+
+ //SFTP error codes missing from libssh2: https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1
+ case 22: return L"SSH_FX_CANNOT_DELETE";
+ case 23: return L"SSH_FX_INVALID_PARAMETER";
+ case 24: return L"SSH_FX_FILE_IS_A_DIRECTORY";
+ case 25: return L"SSH_FX_BYTE_RANGE_LOCK_CONFLICT";
+ case 26: return L"SSH_FX_BYTE_RANGE_LOCK_REFUSED";
+ case 27: return L"SSH_FX_DELETE_PENDING";
+ case 28: return L"SSH_FX_FILE_CORRUPT";
+ case 29: return L"SSH_FX_OWNER_INVALID";
+ case 30: return L"SSH_FX_GROUP_INVALID";
+ case 31: return L"SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK";
+
+ default: return replaceCpy<std::wstring>(L"SFTP status %x.", L"%x", numberTo<std::wstring>(sc));
+ //*INDENT-ON*
+ }
+}
+}
+}
+
+#else
+#error Why is this header already defined? Do not include in other headers: encapsulate the gory details!
+#endif //LIBSSH2_WRAP_H_087280957180967346572465
bgstack15