set_capability( "access", 0 )
set_category( CAT_INPUT )
set_subcategory( SUBCAT_INPUT_ACCESS )
- add_integer( "sftp-caching", 2 * DEFAULT_PTS_DELAY / 1000, NULL,
+ add_integer( "sftp-caching", 2 * DEFAULT_PTS_DELAY / 1000,
CACHING_TEXT, CACHING_LONGTEXT, true );
- add_integer( "sftp-readsize", 8192, NULL, MTU_TEXT, MTU_LONGTEXT, true )
- add_integer( "sftp-port", 22, NULL, PORT_TEXT, PORT_LONGTEXT, true )
+ add_integer( "sftp-readsize", 8192, MTU_TEXT, MTU_LONGTEXT, true )
+ add_integer( "sftp-port", 22, PORT_TEXT, PORT_LONGTEXT, true )
add_shortcut( "sftp" )
set_callbacks( Open, Close )
vlc_module_end ()
int i_port;
int i_ret;
vlc_url_t url;
+ size_t i_len;
+ int i_type;
if( !p_access->psz_location )
return VLC_EGENERIC;
p_sys->i_socket = net_Connect( p_access, url.psz_host, i_port, SOCK_STREAM, 0 );
/* Create the ssh connexion and wait until the server answer */
- p_sys->ssh_session = libssh2_session_init();
+ if( ( p_sys->ssh_session = libssh2_session_init() ) == NULL )
+ goto error;
+
while( ( i_ret = libssh2_session_startup( p_sys->ssh_session,
p_sys->i_socket ) )
== LIBSSH2_ERROR_EAGAIN );
goto error;
}
- /* Ask for the fingerprint ... */
- // TODO: check it
+ /* Set the socket in non-blocking mode */
libssh2_session_set_blocking( p_sys->ssh_session, 1 );
- const char* fingerprint = libssh2_hostkey_hash( p_sys->ssh_session, LIBSSH2_HOSTKEY_HASH_MD5 );
- fprintf(stderr, "Fingerprint: ");
- for( int i = 0; i < 16; i++) {
- fprintf(stderr, "%02X ", (unsigned char)fingerprint[i]);
+
+ /* List the know hosts */
+ LIBSSH2_KNOWNHOSTS *ssh_knownhosts = libssh2_knownhost_init( p_sys->ssh_session );
+ if( !ssh_knownhosts )
+ goto error;
+
+ char *psz_home = config_GetUserDir( VLC_HOME_DIR );
+ char *psz_knownhosts_file;
+ asprintf( &psz_knownhosts_file, "%s/.ssh/known_hosts", psz_home );
+ libssh2_knownhost_readfile( ssh_knownhosts, psz_knownhosts_file,
+ LIBSSH2_KNOWNHOST_FILE_OPENSSH );
+ free( psz_knownhosts_file );
+ free( psz_home );
+
+ const char *fingerprint = libssh2_session_hostkey( p_sys->ssh_session, &i_len, &i_type );
+ struct libssh2_knownhost *host;
+ int check = libssh2_knownhost_check( ssh_knownhosts, url.psz_host,
+ fingerprint, i_len,
+ LIBSSH2_KNOWNHOST_TYPE_PLAIN |
+ LIBSSH2_KNOWNHOST_KEYENC_RAW,
+ &host );
+
+ libssh2_knownhost_free( ssh_knownhosts );
+
+ /* Check that it does match or at least that the host is unkown */
+ switch(check)
+ {
+ case LIBSSH2_KNOWNHOST_CHECK_FAILURE:
+ case LIBSSH2_KNOWNHOST_CHECK_NOTFOUND:
+ msg_Dbg( p_access, "Unable to check the remote host" );
+ break;
+ case LIBSSH2_KNOWNHOST_CHECK_MATCH:
+ msg_Dbg( p_access, "Succesfuly matched the host" );
+ break;
+ case LIBSSH2_KNOWNHOST_CHECK_MISMATCH:
+ msg_Err( p_access, "The host does not match !! The remote key changed !!" );
+ goto error;
}
- fprintf(stderr, "\n");
//TODO: ask for the available auth methods
return VLC_SUCCESS;
error:
+ if( p_sys->ssh_session )
+ libssh2_session_free( p_sys->ssh_session );
free( psz_password );
free( psz_username );
vlc_UrlClean( &url );