Commit ca78be7d authored by Thomas Guillem's avatar Thomas Guillem

dsm: update with last API changes

libdsm functions return now a negative number in case of error. Add NT_STATUS
error check to detect permission errors in order to ask for credentials only in
that case.
parent 106a3256
...@@ -1768,7 +1768,7 @@ AS_IF([test "${SYS}" = "mingw32"], [ VLC_ADD_PLUGIN([smb]) ]) ...@@ -1768,7 +1768,7 @@ AS_IF([test "${SYS}" = "mingw32"], [ VLC_ADD_PLUGIN([smb]) ])
dnl dnl
dnl liBDSM access module dnl liBDSM access module
dnl dnl
PKG_ENABLE_MODULES_VLC([DSM], [dsm], [libdsm >= 0.0.7], [libdsm SMB/CIFS access/sd module], [auto]) PKG_ENABLE_MODULES_VLC([DSM], [dsm], [libdsm >= 0.2.0], [libdsm SMB/CIFS access/sd module], [auto])
dnl dnl
dnl sftp access support dnl sftp access support
......
...@@ -154,8 +154,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -154,8 +154,9 @@ static int Open( vlc_object_t *p_this )
inet_ntoa( p_sys->addr ) ); inet_ntoa( p_sys->addr ) );
/* Now that we have the required data, let's establish a session */ /* Now that we have the required data, let's establish a session */
if( !smb_session_connect( p_sys->p_session, p_sys->netbios_name, if( smb_session_connect( p_sys->p_session, p_sys->netbios_name,
p_sys->addr.s_addr, SMB_TRANSPORT_TCP ) ) p_sys->addr.s_addr, SMB_TRANSPORT_TCP )
!= DSM_SUCCESS )
{ {
msg_Err( p_access, "Unable to connect/negotiate SMB session"); msg_Err( p_access, "Unable to connect/negotiate SMB session");
goto error; goto error;
...@@ -237,7 +238,7 @@ static int get_address( access_t *p_access ) ...@@ -237,7 +238,7 @@ static int get_address( access_t *p_access )
/* Is this a netbios name on this LAN ? */ /* Is this a netbios name on this LAN ? */
if( netbios_ns_resolve( p_sys->p_ns, p_sys->url.psz_host, if( netbios_ns_resolve( p_sys->p_ns, p_sys->url.psz_host,
NETBIOS_FILESERVER, NETBIOS_FILESERVER,
&p_sys->addr.s_addr) ) &p_sys->addr.s_addr) == 0 )
{ {
strlcpy( p_sys->netbios_name, p_sys->url.psz_host, 16); strlcpy( p_sys->netbios_name, p_sys->url.psz_host, 16);
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -276,27 +277,25 @@ static int get_address( access_t *p_access ) ...@@ -276,27 +277,25 @@ static int get_address( access_t *p_access )
} }
static int smb_connect( access_t *p_access, const char *psz_login, static int smb_connect( access_t *p_access, const char *psz_login,
const char *psz_password, const char *psz_domain ) const char *psz_password, const char *psz_domain)
{ {
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
smb_session_set_creds( p_sys->p_session, psz_domain, smb_session_set_creds( p_sys->p_session, psz_domain,
psz_login, psz_password ); psz_login, psz_password );
if( smb_session_login( p_sys->p_session ) ) if( smb_session_login( p_sys->p_session ) == DSM_SUCCESS )
{ {
if( p_sys->psz_share ) if( p_sys->psz_share )
{ {
/* Connect to the share */ /* Connect to the share */
p_sys->i_tid = smb_tree_connect( p_sys->p_session, p_sys->psz_share ); if( smb_tree_connect( p_sys->p_session, p_sys->psz_share,
if( !p_sys->i_tid ) &p_sys->i_tid ) != DSM_SUCCESS )
return VLC_EGENERIC; return VLC_EGENERIC;
/* Let's finally ask a handle to the file we wanna read ! */ /* Let's finally ask a handle to the file we wanna read ! */
p_sys->i_fd = smb_fopen( p_sys->p_session, p_sys->i_tid, return smb_fopen( p_sys->p_session, p_sys->i_tid, p_sys->psz_path,
p_sys->psz_path, SMB_MOD_RO ); SMB_MOD_RO, &p_sys->i_fd )
/* TODO: fix smb_fopen to return a specific error code in case of == DSM_SUCCESS ? VLC_SUCCESS : VLC_EGENERIC;
* wrong permissions */
return p_sys->i_fd > 0 ? VLC_SUCCESS : VLC_EGENERIC;
} }
else else
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -305,6 +304,15 @@ static int smb_connect( access_t *p_access, const char *psz_login, ...@@ -305,6 +304,15 @@ static int smb_connect( access_t *p_access, const char *psz_login,
return VLC_EGENERIC; return VLC_EGENERIC;
} }
static bool smb_has_invalid_creds( access_t *p_access )
{
access_sys_t *p_sys = p_access->p_sys;
uint32_t i_nt_status = smb_session_get_nt_status( p_sys->p_session );
return i_nt_status == NT_STATUS_ACCESS_DENIED
|| i_nt_status == NT_STATUS_LOGON_FAILURE;
}
/* Performs login with existing credentials and ask the user for new ones on /* Performs login with existing credentials and ask the user for new ones on
failure */ failure */
static int login( access_t *p_access ) static int login( access_t *p_access )
...@@ -342,7 +350,8 @@ static int login( access_t *p_access ) ...@@ -342,7 +350,8 @@ static int login( access_t *p_access )
if( smb_connect( p_access, psz_login, psz_password, psz_domain ) if( smb_connect( p_access, psz_login, psz_password, psz_domain )
!= VLC_SUCCESS ) != VLC_SUCCESS )
{ {
while( vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd", while( smb_has_invalid_creds( p_access)
&& vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd",
SMB_LOGIN_DIALOG_TITLE, SMB_LOGIN_DIALOG_TITLE,
SMB_LOGIN_DIALOG_TEXT, p_sys->netbios_name ) ) SMB_LOGIN_DIALOG_TEXT, p_sys->netbios_name ) )
{ {
...@@ -452,8 +461,8 @@ static int Seek( access_t *p_access, uint64_t i_pos ) ...@@ -452,8 +461,8 @@ static int Seek( access_t *p_access, uint64_t i_pos )
msg_Dbg( p_access, "seeking to %"PRId64, i_pos ); msg_Dbg( p_access, "seeking to %"PRId64, i_pos );
/* seek cannot fail in bdsm, but the subsequent read can */ if (smb_fseek(p_sys->p_session, p_sys->i_fd, i_pos, SMB_SEEK_SET) == -1)
smb_fseek(p_sys->p_session, p_sys->i_fd, i_pos, SMB_SEEK_SET); return VLC_EGENERIC;
p_access->info.b_eof = false; p_access->info.b_eof = false;
...@@ -557,8 +566,14 @@ static input_item_t* BrowseShare( access_t *p_access ) ...@@ -557,8 +566,14 @@ static input_item_t* BrowseShare( access_t *p_access )
input_item_t *p_item = NULL; input_item_t *p_item = NULL;
if( !p_sys->i_browse_count ) if( !p_sys->i_browse_count )
p_sys->i_browse_count = smb_share_get_list( p_sys->p_session, {
&p_sys->shares ); size_t i_count;
if( smb_share_get_list( p_sys->p_session, &p_sys->shares, &i_count )
!= DSM_SUCCESS )
return NULL;
else
p_sys->i_browse_count = i_count;
}
for( ; !p_item && p_sys->i_browse_idx < p_sys->i_browse_count for( ; !p_item && p_sys->i_browse_idx < p_sys->i_browse_count
; p_sys->i_browse_idx++ ) ; p_sys->i_browse_idx++ )
{ {
......
...@@ -160,8 +160,8 @@ int bdsm_SdOpen (vlc_object_t *p_this) ...@@ -160,8 +160,8 @@ int bdsm_SdOpen (vlc_object_t *p_this)
callbacks.pf_on_entry_added = netbios_ns_discover_on_entry_added; callbacks.pf_on_entry_added = netbios_ns_discover_on_entry_added;
callbacks.pf_on_entry_removed = netbios_ns_discover_on_entry_removed; callbacks.pf_on_entry_removed = netbios_ns_discover_on_entry_removed;
if( !netbios_ns_discover_start( p_sys->p_ns, BROADCAST_TIMEOUT, if( netbios_ns_discover_start( p_sys->p_ns, BROADCAST_TIMEOUT,
&callbacks) ) &callbacks) != 0 )
goto error; goto error;
return VLC_SUCCESS; return VLC_SUCCESS;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment