50
50
tunnel_auth_error(const std::string &err) : std::runtime_error(err) {}
53
class tunnel_auth_retry : public std::runtime_error
56
tunnel_auth_retry(const std::string &err) : std::runtime_error(err) {}
59
class tunnel_auth_cancelled : public std::runtime_error
62
tunnel_auth_cancelled(const std::string &err) : std::runtime_error(err) {}
65
class tunnel_auth_key_error : public std::runtime_error
68
tunnel_auth_key_error(const std::string &err) : std::runtime_error(err) {}
53
72
class SSHTunnel : public sql::TunnelConnection
55
74
TunnelManager *_tm;
122
141
std::string progpath = bec::make_path(_wb->get_grt_manager()->get_basedir(), "sshtunnel.py");
124
grt::WillEnterPython lock;
143
WillEnterPython lock;
125
144
grt::PythonContext *py = grt::PythonContext::get();
126
145
if (py->run_file(progpath, false) < 0)
135
154
int TunnelManager::lookup_tunnel(const char *server, const char *username, const char *target)
137
grt::WillEnterPython lock;
156
WillEnterPython lock;
139
158
// Note: without the (char*) cast gcc will complain about passing a const char* to a char*.
140
159
// Ideally the function signature should be changed to take a const char*.
175
194
int TunnelManager::open_tunnel(const char *server, const char *username, const char *password,
176
195
const char *keyfile, const char *target)
178
grt::WillEnterPython lock;
197
WillEnterPython lock;
179
198
PyObject *ret = PyObject_CallMethod(_tunnel, (char*) "open_tunnel", (char*) "sssss",
180
199
server, username, password, keyfile, target);
241
260
throw tunnel_auth_error("Authentication error. Please check that your username and password are correct and try again."
242
261
"\nDetails (Original exception message):\n" + str);
244
if ( g_str_has_prefix(str.c_str(), "Authentication error") )
263
if (g_str_has_prefix(str.c_str(), "Server key has been stored"))
265
log_info("TunnelManager.wait_connection server key stored, retrying: %s\n", str.c_str());
266
throw tunnel_auth_retry("Retry due to fingerprint missing, user accept new fingerprint");
269
if (g_str_has_prefix(str.c_str(), "Host key for server "))
271
log_info("TunnelManager.wait_connection host key does not match, abandoning connection: %s\n", str.c_str());
272
throw tunnel_auth_key_error(str);
275
if (g_str_has_prefix(str.c_str(), "User cancelled"))
277
log_info("TunnelManager.wait_connection cancelled by the user: %s\n", str.c_str());
278
throw tunnel_auth_cancelled("Tunnel connection cancelled by the user");
280
if (g_str_has_prefix(str.c_str(), "IO Error"))
282
log_error("TunnelManager.wait_connection got IOError: %s\n", str.c_str());
283
throw tunnel_auth_key_error(str);
286
if (g_str_has_prefix(str.c_str(), "Authentication error"))
288
log_info("TunnelManager.wait_connection authentication error: %s\n", str.c_str());
245
289
throw tunnel_auth_error(str);
247
292
throw std::runtime_error("Error connecting SSH tunnel: "+str);
253
298
std::list<std::pair<std::string, std::string> > messages;
255
grt::WillEnterPython lock;
300
WillEnterPython lock;
257
302
PyObject *ret = PyObject_CallMethod(_tunnel, (char*) "get_message", (char*) "i", port);
291
336
void TunnelManager::close_tunnel(int port)
293
grt::WillEnterPython lock;
338
WillEnterPython lock;
294
339
PyObject *ret = PyObject_CallMethod(_tunnel, (char*) "close", (char*) "i", port);
408
453
throw grt::user_cancelled("Tunnel connection cancelled");
455
catch (tunnel_auth_retry &exc)
457
log_warning("Opening SSH tunnel: %s\n", exc.what());
460
catch (tunnel_auth_cancelled &exc)
462
log_debug("Tunnel auth cancelled: %s\n", exc.what());
463
throw grt::user_cancelled(exc.what());
465
catch (tunnel_auth_key_error &exc)
467
mforms::Utilities::show_error("Tunnel Connection Error", exc.what(), _("OK"));
468
log_debug("Tunnel auth key error: %s\n", exc.what());
469
throw grt::user_cancelled(exc.what());
410
471
catch (std::exception &exc)
412
473
log_error("Exception while opening SSH tunnel: %s\n", exc.what());