/* * Constructor for Session objects, never called by Python code directly * * Arguments: cert - A "real" Session certificate object * Returns: The newly created Session object */ SSH2_SessionObj * SSH2_Session_New(LIBSSH2_SESSION *session) { SSH2_SessionObj *self; if ((self = PyObject_New(SSH2_SessionObj, &SSH2_Session_Type)) == NULL) return NULL; self->session = session; self->opened = 0; self->socket = Py_None; self->cb_ignore = Py_None; self->cb_debug = Py_None; self->cb_disconnect = Py_None; self->cb_macerror = Py_None; self->cb_x11 = Py_None; self->cb_passwd_changereq = Py_None; self->cb_kbdint_response = Py_None; Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); Py_INCREF(Py_None); *libssh2_session_abstract(session) = self; libssh2_banner_set(session, LIBSSH2_SSH_DEFAULT_BANNER " Python"); return self; }
static PyObject * session_banner_set(SSH2_SessionObj *self, PyObject *args) { char *banner; if (!PyArg_ParseTuple(args, "s:banner_set", &banner)) return NULL; libssh2_banner_set(self->session, banner); Py_RETURN_NONE; }
/* {{{ PYLIBSSH2_Session_New */ PYLIBSSH2_SESSION * PYLIBSSH2_Session_New(LIBSSH2_SESSION *session, int dealloc) { PYLIBSSH2_SESSION *self; self = PyObject_New(PYLIBSSH2_SESSION, &PYLIBSSH2_Session_Type); if (self == NULL) { return NULL; } self->session = session; self->dealloc = dealloc; self->opened = 0; self->socket = NULL; libssh2_banner_set(session, LIBSSH2_SSH_DEFAULT_BANNER " Python"); return self; }
static int ssh_client_profile_set(obfsproxyssh_client_session_t *session) { obfsproxyssh_t *state = session->client->state; const obfsproxyssh_client_profile_t *profile = ssh_client_profile_current; int i, rval; assert(NULL != profile); rval = libssh2_banner_set(session->ssh_session, profile->banner); if (0 != rval) { log_f(state, "SSH: Error: %s Failed to set banner %d", bdata(session->ssh_addr), rval); } libssh2_session_flag(session->ssh_session, LIBSSH2_FLAG_COMPRESS, profile->enable_compression); /* * Failure to set things to exactly what I specify should be a * immediate and fatal error as the lists in the profiles are chosen * carefully to match existing client(s) in the wild, but see the * comments in ssh_client_profile_init(). */ for (i = 0; i <= LIBSSH2_METHOD_LANG_SC; i++) { /* Trying to force a value to NULL, causes libssh2 to SIGSEGV */ if (NULL == profile->kex_methods[i]) continue; rval = libssh2_session_method_pref(session->ssh_session, i, profile->kex_methods[i]); if (0 != rval) { log_f(state, "SSH: Error: %s Failed to set prefered methods %d (%d)", bdata(session->ssh_addr), i, rval); return -1; } } return 0; }
/* {{{ php_ssh2_session_connect * Connect to an SSH server with requested methods */ LIBSSH2_SESSION *php_ssh2_session_connect(char *host, int port, zval *methods, zval *callbacks) { LIBSSH2_SESSION *session; int socket; php_ssh2_session_data *data; struct timeval tv; zend_string *hash_lookup_zstring; tv.tv_sec = FG(default_socket_timeout); tv.tv_usec = 0; socket = php_network_connect_socket_to_host(host, port, SOCK_STREAM, 0, &tv, NULL, NULL, NULL, 0, STREAM_SOCKOP_NONE); if (socket <= 0) { php_error_docref(NULL, E_WARNING, "Unable to connect to %s on port %d", host, port); return NULL; } data = ecalloc(1, sizeof(php_ssh2_session_data)); data->socket = socket; session = libssh2_session_init_ex(php_ssh2_alloc_cb, php_ssh2_free_cb, php_ssh2_realloc_cb, data); if (!session) { php_error_docref(NULL, E_WARNING, "Unable to initialize SSH2 session"); efree(data); closesocket(socket); return NULL; } libssh2_banner_set(session, LIBSSH2_SSH_DEFAULT_BANNER " PHP"); /* Override method preferences */ if (methods) { zval *container; if (php_ssh2_set_method(session, HASH_OF(methods), "kex", sizeof("kex") - 1, LIBSSH2_METHOD_KEX)) { php_error_docref(NULL, E_WARNING, "Failed overriding KEX method"); } if (php_ssh2_set_method(session, HASH_OF(methods), "hostkey", sizeof("hostkey") - 1, LIBSSH2_METHOD_HOSTKEY)) { php_error_docref(NULL, E_WARNING, "Failed overriding HOSTKEY method"); } hash_lookup_zstring = zend_string_init("client_to_server", sizeof("client_to_server") - 1, 0); if ((container = zend_hash_find(HASH_OF(methods), hash_lookup_zstring)) != NULL && Z_TYPE_P(container) == IS_ARRAY) { if (php_ssh2_set_method(session, HASH_OF(container), "crypt", sizeof("crypt") - 1, LIBSSH2_METHOD_CRYPT_CS)) { php_error_docref(NULL, E_WARNING, "Failed overriding client to server CRYPT method"); } if (php_ssh2_set_method(session, HASH_OF(container), "mac", sizeof("mac") - 1, LIBSSH2_METHOD_MAC_CS)) { php_error_docref(NULL, E_WARNING, "Failed overriding client to server MAC method"); } if (php_ssh2_set_method(session, HASH_OF(container), "comp", sizeof("comp") - 1, LIBSSH2_METHOD_COMP_CS)) { php_error_docref(NULL, E_WARNING, "Failed overriding client to server COMP method"); } if (php_ssh2_set_method(session, HASH_OF(container), "lang", sizeof("lang") - 1, LIBSSH2_METHOD_LANG_CS)) { php_error_docref(NULL, E_WARNING, "Failed overriding client to server LANG method"); } } zend_string_release(hash_lookup_zstring); hash_lookup_zstring = zend_string_init("server_to_client", sizeof("server_to_client") - 1, 0); if ((container = zend_hash_find(HASH_OF(methods), hash_lookup_zstring)) != NULL && Z_TYPE_P(container) == IS_ARRAY) { if (php_ssh2_set_method(session, HASH_OF(container), "crypt", sizeof("crypt") - 1, LIBSSH2_METHOD_CRYPT_SC)) { php_error_docref(NULL, E_WARNING, "Failed overriding server to client CRYPT method"); } if (php_ssh2_set_method(session, HASH_OF(container), "mac", sizeof("mac") - 1, LIBSSH2_METHOD_MAC_SC)) { php_error_docref(NULL, E_WARNING, "Failed overriding server to client MAC method"); } if (php_ssh2_set_method(session, HASH_OF(container), "comp", sizeof("comp") - 1, LIBSSH2_METHOD_COMP_SC)) { php_error_docref(NULL, E_WARNING, "Failed overriding server to client COMP method"); } if (php_ssh2_set_method(session, HASH_OF(container), "lang", sizeof("lang") - 1, LIBSSH2_METHOD_LANG_SC)) { php_error_docref(NULL, E_WARNING, "Failed overriding server to client LANG method"); } } zend_string_release(hash_lookup_zstring); } /* Register Callbacks */ if (callbacks) { /* ignore debug disconnect macerror */ if (php_ssh2_set_callback(session, HASH_OF(callbacks), "ignore", sizeof("ignore") - 1, LIBSSH2_CALLBACK_IGNORE, data)) { php_error_docref(NULL, E_WARNING, "Failed setting IGNORE callback"); } if (php_ssh2_set_callback(session, HASH_OF(callbacks), "debug", sizeof("debug") - 1, LIBSSH2_CALLBACK_DEBUG, data)) { php_error_docref(NULL, E_WARNING, "Failed setting DEBUG callback"); } if (php_ssh2_set_callback(session, HASH_OF(callbacks), "macerror", sizeof("macerror") - 1, LIBSSH2_CALLBACK_MACERROR, data)) { php_error_docref(NULL, E_WARNING, "Failed setting MACERROR callback"); } if (php_ssh2_set_callback(session, HASH_OF(callbacks), "disconnect", sizeof("disconnect") - 1, LIBSSH2_CALLBACK_DISCONNECT, data)) { php_error_docref(NULL, E_WARNING, "Failed setting DISCONNECT callback"); } } if (libssh2_session_startup(session, socket)) { int last_error = 0; char *error_msg = NULL; last_error = libssh2_session_last_error(session, &error_msg, NULL, 0); php_error_docref(NULL, E_WARNING, "Error starting up SSH connection(%d): %s", last_error, error_msg); closesocket(socket); libssh2_session_free(session); efree(data); return NULL; } return session; }