[vlc-commits] dsm: use vlc_credential

Thomas Guillem git at videolan.org
Thu Jan 7 20:12:42 CET 2016


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Jan  7 12:03:54 2016 +0100| [ec38bcd065636552a93e37bdaee371985c2ed48a] | committer: Thomas Guillem

dsm: use vlc_credential

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ec38bcd065636552a93e37bdaee371985c2ed48a
---

 modules/access/dsm/access.c |  158 ++++++++++++++++++-------------------------
 1 file changed, 66 insertions(+), 92 deletions(-)

diff --git a/modules/access/dsm/access.c b/modules/access/dsm/access.c
index 6da24fc..7165fd3 100644
--- a/modules/access/dsm/access.c
+++ b/modules/access/dsm/access.c
@@ -33,7 +33,7 @@
 #include <vlc_url.h>
 #include <vlc_access.h>
 #include <vlc_variables.h>
-#include <vlc_dialog.h>
+#include <vlc_keystore.h>
 
 #include <string.h>
 #include <sys/socket.h>
@@ -102,10 +102,7 @@ static int Seek( access_t *, uint64_t );
 static int Control( access_t *, int, va_list );
 static int BrowserInit( access_t *p_access );
 
-static void split_domain_login( char **psz_login, char **psz_domain );
-static void get_credentials( access_t *p_access );
 static int get_address( access_t *p_access );
-static void login_dialog( access_t *p_access );
 static int login( access_t *p_access );
 static void backslash_path( vlc_url_t *p_url );
 static bool get_path( access_t *p_access );
@@ -165,7 +162,6 @@ static int Open( vlc_object_t *p_this )
         goto error;
 
     vlc_UrlParse( &p_sys->url, p_access->psz_location );
-    get_credentials( p_access );
     if( get_address( p_access ) != VLC_SUCCESS )
         goto error;
 
@@ -255,44 +251,6 @@ static void Close( vlc_object_t *p_this )
  * Local functions
  *****************************************************************************/
 
-/* Split DOMAIN;User if it finds a ';' in psz_login. */
-static void split_domain_login( char **psz_login, char **psz_domain )
-{
-    char *user = strchr( *psz_login, ';' );
-
-    if( user != NULL )
-    {
-        *psz_domain = *psz_login;
-        *user = '\0';
-        *psz_login = strdup( user + 1 );
-    }
-}
-
-/* Get credentials from uri or variables. */
-static void get_credentials( access_t *p_access )
-{
-    access_sys_t *p_sys = p_access->p_sys;
-
-    /* Fetch credentials, either from URI or from options if not provided */
-    if( p_sys->url.psz_password == NULL )
-        p_sys->creds.password = var_InheritString( p_access, "smb-pwd" );
-    else
-        p_sys->creds.password = strdup( p_sys->url.psz_password );
-
-    /* Here we support smb://DOMAIN;User:password@XXX, get user from options
-       or default to "Guest" as last resort */
-    if( p_sys->url.psz_username != NULL )
-    {
-        p_sys->creds.login = strdup( p_sys->url.psz_username );
-        split_domain_login( &p_sys->creds.login, &p_sys->creds.domain );
-    }
-    else
-        p_sys->creds.login = var_InheritString( p_access, "smb-user" );
-
-    if( p_sys->creds.domain == NULL )
-        p_sys->creds.domain = var_InheritString( p_access, "smb-domain" );
-}
-
 /* Returns VLC_EGENERIC if it wasn't able to get an ip address to connect to */
 static int get_address( access_t *p_access )
 {
@@ -338,54 +296,14 @@ static int get_address( access_t *p_access )
         p_sys->netbios_name[0] = '\0';
     }
 
-    /* If no domain was explicitly specified, let's use the machine name */
-    if( p_sys->creds.domain == NULL && p_sys->netbios_name[0] )
-        p_sys->creds.domain = strdup( p_sys->netbios_name );
-
     return VLC_SUCCESS;
 }
 
-/* Displays a dialog for the user to enter his/her credentials */
-static void login_dialog( access_t *p_access )
+static int smb_connect( access_t *p_access, const char *psz_login,
+                        const char *psz_password, const char *psz_domain )
 {
     access_sys_t *p_sys = p_access->p_sys;
 
-    char *psz_login = NULL, *psz_pass = NULL, *psz_title;
-    int i_ret;
-
-    i_ret = asprintf( &psz_title, BDSM_LOGIN_DIALOG_TITLE, p_sys->netbios_name );
-    if( i_ret != -1 )
-        dialog_Login( p_access, &psz_login, &psz_pass, psz_title,
-                      BDSM_LOGIN_DIALOG_TEXT );
-    else
-        dialog_Login( p_access, &psz_login, &psz_pass, BDSM_LOGIN_DIALOG_TITLE,
-                      BDSM_LOGIN_DIALOG_TEXT );
-    free( psz_title );
-
-    if( psz_login != NULL )
-    {
-        free( p_sys->creds.login );
-        p_sys->creds.login = psz_login;
-        split_domain_login( &p_sys->creds.login, &p_sys->creds.domain );
-    }
-
-    if( psz_pass != NULL )
-    {
-        free( p_sys->creds.password );
-        p_sys->creds.password = psz_pass;
-    }
-}
-
-static int smb_connect( access_t *p_access )
-{
-    access_sys_t *p_sys = p_access->p_sys;
-    const char *psz_login = p_sys->creds.login ?
-                            p_sys->creds.login : "Guest";
-    const char *psz_password = p_sys->creds.password ?
-                               p_sys->creds.password : "Guest";
-    const char *psz_domain = p_sys->creds.domain ?
-                             p_sys->creds.domain : p_sys->netbios_name;
-
     smb_session_set_creds( p_sys->p_session, psz_domain,
                            psz_login, psz_password );
     if( smb_session_login( p_sys->p_session ) )
@@ -407,26 +325,82 @@ static int smb_connect( access_t *p_access )
    failure */
 static int login( access_t *p_access )
 {
+    int i_ret = VLC_EGENERIC;
     access_sys_t *p_sys = p_access->p_sys;
+    vlc_url_t url;
+    vlc_credential credential;
+    char *psz_var_domain;
+    const char *psz_login, *psz_password, *psz_domain;
+
+    vlc_UrlParse( &url, p_access->psz_url );
+    vlc_credential_init( &credential, &url );
+    psz_var_domain = var_InheritString( p_access, "smb-domain" );
+    credential.psz_realm = psz_var_domain ? psz_var_domain : p_sys->netbios_name;
+
+    vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd",
+                        NULL, NULL );
+
+    if( !credential.psz_username )
+    {
+        psz_login = "Guest";
+        psz_password = "Guest";
+    }
+    else
+    {
+        psz_login = credential.psz_username;
+        psz_password = credential.psz_password;
+    }
+    psz_domain = credential.psz_realm;
 
     /* Try to authenticate on the remote machine */
-    if( smb_connect( p_access ) != VLC_SUCCESS )
+    if( smb_connect( p_access, psz_login, psz_password, psz_domain )
+                     != VLC_SUCCESS )
     {
-        for( int i = 0; i < BDSM_LOGIN_DIALOG_RETRY; i++ )
+        char *psz_title;
+        if ( asprintf( &psz_title, BDSM_LOGIN_DIALOG_TITLE,
+                       p_sys->netbios_name ) == -1 )
+            goto error;
+        while( vlc_credential_get( &credential, p_access, "smb-user", "smb-pwd",
+                                   psz_title, BDSM_LOGIN_DIALOG_TEXT ) )
         {
-            login_dialog( p_access );
-            if( smb_connect( p_access ) == VLC_SUCCESS )
-                return VLC_SUCCESS;
+            psz_login = credential.psz_username;
+            psz_password = credential.psz_password;
+            psz_domain = credential.psz_realm;
+            if( smb_connect( p_access, psz_login, psz_password, psz_domain )
+                             == VLC_SUCCESS )
+            {
+                free( psz_title );
+                goto success;
+            }
         }
+        free( psz_title );
 
         msg_Err( p_access, "Unable to login with username = %s, domain = %s",
                    p_sys->creds.login, p_sys->creds.domain );
-        return VLC_EGENERIC;
+        goto error;
     }
     else if( smb_session_is_guest( p_sys->p_session )  )
         msg_Warn( p_access, "Login failure but you were logged in as a Guest");
 
-    return VLC_SUCCESS;
+success:
+    p_sys->creds.login = strdup(psz_login);
+    p_sys->creds.password = strdup(psz_password);
+    p_sys->creds.domain = strdup(psz_domain);
+    if (!p_sys->creds.login || !p_sys->creds.password || !p_sys->creds.domain)
+    {
+        free(p_sys->creds.login);
+        free(p_sys->creds.password);
+        free(p_sys->creds.domain);
+        p_sys->creds.login = p_sys->creds.password = p_sys->creds.domain = NULL;
+        goto error;
+    }
+    vlc_credential_store( &credential );
+    i_ret = VLC_SUCCESS;
+error:
+    vlc_credential_clean( &credential );
+    vlc_UrlClean( &url );
+    free( psz_var_domain );
+    return i_ret;
 }
 
 static void backslash_path( vlc_url_t *p_url )



More information about the vlc-commits mailing list