[vlc-devel] [PATCH 1/2] dsm: query credentials only when needed
Thomas Guillem
thomas at gllm.fr
Tue Oct 15 13:25:37 CEST 2019
Query credentials only if the nt_status is NT_STATUS_ACCESS_DENIED.
This prevents to ask for credentials when the file/dir/share doesn't exist.
---
modules/access/dsm/access.c | 68 ++++++++++++++++++++++---------------
1 file changed, 40 insertions(+), 28 deletions(-)
diff --git a/modules/access/dsm/access.c b/modules/access/dsm/access.c
index 976765399c..776925c9ee 100644
--- a/modules/access/dsm/access.c
+++ b/modules/access/dsm/access.c
@@ -37,6 +37,7 @@
#include <vlc_network.h>
#include <assert.h>
+#include <errno.h>
#include <string.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
@@ -271,32 +272,37 @@ static int get_address( stream_t *p_access )
return VLC_SUCCESS;
}
+/* Returns an errno code */
static int smb_connect( stream_t *p_access, const char *psz_login,
const char *psz_password, const char *psz_domain)
{
access_sys_t *p_sys = p_access->p_sys;
+ int ret;
smb_session_set_creds( p_sys->p_session, psz_domain,
psz_login, psz_password );
- if( smb_session_login( p_sys->p_session ) == DSM_SUCCESS )
- {
- if( p_sys->psz_share )
- {
- /* Connect to the share */
- if( smb_tree_connect( p_sys->p_session, p_sys->psz_share,
- &p_sys->i_tid ) != DSM_SUCCESS )
- return VLC_EGENERIC;
+ if( smb_session_login( p_sys->p_session ) != DSM_SUCCESS )
+ return EACCES;
- /* Let's finally ask a handle to the file we wanna read ! */
- return smb_fopen( p_sys->p_session, p_sys->i_tid, p_sys->psz_path,
- SMB_MOD_RO, &p_sys->i_fd )
- == DSM_SUCCESS ? VLC_SUCCESS : VLC_EGENERIC;
- }
- else
- return VLC_SUCCESS;
- }
- else
- return VLC_EGENERIC;
+ if( !p_sys->psz_share )
+ return 0;
+
+ /* Connect to the share */
+ ret = smb_tree_connect( p_sys->p_session, p_sys->psz_share, &p_sys->i_tid );
+ if( ret != DSM_SUCCESS )
+ goto error;
+
+ /* Let's finally ask a handle to the file we wanna read ! */
+ ret = smb_fopen( p_sys->p_session, p_sys->i_tid, p_sys->psz_path,
+ SMB_MOD_RO, &p_sys->i_fd );
+ if( ret != DSM_SUCCESS )
+ goto error;
+
+ return 0;
+
+error:
+ return ret == DSM_ERROR_NT && smb_session_get_nt_status( p_sys->p_session )
+ == NT_STATUS_ACCESS_DENIED ? EACCES : ENOENT;
}
/* Performs login with existing credentials and ask the user for new ones on
@@ -331,8 +337,11 @@ static int login( stream_t *p_access )
psz_domain = credential.psz_realm ? credential.psz_realm : p_sys->netbios_name;
/* Try to authenticate on the remote machine */
- if( smb_connect( p_access, psz_login, psz_password, psz_domain )
- != VLC_SUCCESS )
+ int connect_err = smb_connect( p_access, psz_login, psz_password, psz_domain );
+ if( connect_err == ENOENT )
+ goto error;
+
+ if( connect_err == EACCES )
{
if (var_Type(p_access, "smb-dialog-failed") != 0)
{
@@ -340,7 +349,8 @@ static int login( stream_t *p_access )
* credentials to the users. It is useless to request it again. */
goto error;
}
- while( vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd",
+ while( connect_err == EACCES
+ && vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd",
SMB_LOGIN_DIALOG_TITLE,
SMB_LOGIN_DIALOG_TEXT, p_sys->netbios_name ) )
{
@@ -349,21 +359,23 @@ static int login( stream_t *p_access )
psz_password = credential.psz_password;
psz_domain = credential.psz_realm ? credential.psz_realm
: p_sys->netbios_name;
- if( smb_connect( p_access, psz_login, psz_password, psz_domain )
- == VLC_SUCCESS )
- goto success;
+ connect_err = smb_connect( p_access, psz_login, psz_password, psz_domain );
}
- msg_Err( p_access, "Unable to login" );
- goto error;
+ if( connect_err != 0 )
+ {
+ msg_Err( p_access, "Unable to login" );
+ goto error;
+ }
}
- else if( smb_session_is_guest( p_sys->p_session ) == 1 )
+ assert( connect_err == 0 );
+
+ if( smb_session_is_guest( p_sys->p_session ) == 1 )
{
msg_Warn( p_access, "Login failure but you were logged in as a Guest");
b_guest = true;
}
-success:
msg_Warn( p_access, "Creds: username = '%s', domain = '%s'",
psz_login, psz_domain );
if( !b_guest )
--
2.20.1
More information about the vlc-devel
mailing list