[vlc-devel] [PATCH 4/4] http: add keystore

Steve Lhomme robux4 at gmail.com
Thu Nov 26 10:09:43 CET 2015


On Wed, Nov 25, 2015 at 7:14 PM, Thomas Guillem <thomas at gllm.fr> wrote:
> ---
>  modules/access/http.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 70 insertions(+)
>
> diff --git a/modules/access/http.c b/modules/access/http.c
> index b62f92e..69cfb65 100644
> --- a/modules/access/http.c
> +++ b/modules/access/http.c
> @@ -46,6 +46,7 @@
>  #include <vlc_input.h>
>  #include <vlc_http.h>
>  #include <vlc_interrupt.h>
> +#include <vlc_keystore.h>
>
>  #ifdef HAVE_ZLIB_H
>  #   include <zlib.h>
> @@ -214,6 +215,8 @@ static int Open( vlc_object_t *p_this )
>      access_t *p_access = (access_t*)p_this;
>      const char *psz_url = p_access->psz_url;
>      char *psz;
> +    bool b_store_passwd = false;
> +    vlc_keystore *p_keystore = NULL;
>
>      access_sys_t *p_sys = malloc( sizeof(*p_sys) );
>      if( unlikely(p_sys == NULL) )
> @@ -287,6 +290,8 @@ static int Open( vlc_object_t *p_this )
>          if( p_sys->url.i_port <= 0 )
>              p_sys->url.i_port = 80;
>      }
> +    char psz_port[sizeof(unsigned) * 3];
> +    sprintf(psz_port, "%u", p_sys->url.i_port);
>
>      /* Determine the HTTP user agent */
>      /* See RFC2616 §2.2 token and comment definition, and §3.8 and
> @@ -418,6 +423,53 @@ connect:
>          }
>          msg_Dbg( p_access, "authentication failed for realm %s",
>                   p_sys->auth.psz_realm );
> +
> +        /* Only one try */
> +        if( !p_keystore && ( p_keystore = vlc_keystore_get( p_access ) ) )
> +        {
> +            vlc_keystore_entry *p_entries;
> +            unsigned int i_count =
> +                vlc_keystore_find( p_keystore, &p_entries,
> +                                   KEY_USER, p_sys->url.psz_username,
> +                                   KEY_REALM, p_sys->auth.psz_realm,
> +                                   KEY_SERVER,  p_sys->url.psz_host,
> +                                   KEY_PORT, psz_port,
> +                                   KEY_PROTOCOL, p_sys->url.psz_protocol,

Does it mean passwords for HTTP won't work for HTTPS ?

> +                                   NULL );
> +            if (i_count > 0)
> +            {
> +                vlc_keystore_entry *p_entry;
> +
> +                if (i_count > 1)
> +                {
> +                    /* TODO: a dialog to choose the user ? */
> +                    msg_Warn( p_access, "more than one item matching in keystore!" );
> +                    p_entry = NULL;
> +                }
> +                else
> +                    p_entry = &p_entries[0];
> +
> +                if( p_entry )
> +                {
> +                    const char *psz_val =
> +                        vlc_keystore_entry_get_value( p_entry, "user" );
> +                    const char *psz_secret =
> +                        vlc_keystore_entry_load_secret(p_keystore, p_entry);
> +                    if( psz_val && psz_secret )
> +                    {
> +                        p_sys->url.psz_username = strdup(psz_val);
> +                        p_sys->url.psz_password = strdup(psz_secret);
> +                    }
> +                }
> +                vlc_keystore_release_entries(p_keystore, p_entries, i_count);
> +                if( p_sys->url.psz_username && p_sys->url.psz_password )
> +                {
> +                    Disconnect( p_access );
> +                    goto connect;
> +                }
> +            }
> +        }
> +
>          dialog_Login( p_access, &psz_login, &psz_password,
>                        _("HTTP authentication"),
>               _("Please enter a valid login name and a password for realm %s."),
> @@ -427,6 +479,7 @@ connect:
>              msg_Dbg( p_access, "retrying with user=%s", psz_login );
>              p_sys->url.psz_username = psz_login;
>              p_sys->url.psz_password = psz_password;
> +            b_store_passwd = true; /* TODO: ask for user */
>              Disconnect( p_access );
>              goto connect;
>          }
> @@ -437,6 +490,18 @@ connect:
>              goto error;
>          }
>      }
> +    else if( b_store_passwd )
> +    {
> +        int i_ret = vlc_keystore_store( p_keystore, p_sys->url.psz_password,
> +                                        KEY_USER, p_sys->url.psz_username,
> +                                        KEY_REALM, p_sys->auth.psz_realm,
> +                                        KEY_SERVER,  p_sys->url.psz_host,
> +                                        KEY_PORT, psz_port,
> +                                        KEY_PROTOCOL, p_sys->url.psz_protocol,
> +                                        NULL );
> +        if( i_ret != VLC_SUCCESS )
> +            msg_Warn( p_access, "couldn't store secret" );
> +    }
>
>      if( ( p_sys->i_code == 301 || p_sys->i_code == 302 ||
>            p_sys->i_code == 303 || p_sys->i_code == 307 ) &&
> @@ -482,9 +547,14 @@ connect:
>      p_access->pf_control = Control;
>      p_access->pf_seek = Seek;
>
> +    if( p_keystore )
> +        vlc_keystore_release( p_keystore );
> +
>      return VLC_SUCCESS;
>
>  error:
> +    if( p_keystore )
> +        vlc_keystore_release( p_keystore );
>      vlc_UrlClean( &p_sys->url );
>      if( p_sys->b_proxy )
>          vlc_UrlClean( &p_sys->proxy );
> --
> 2.1.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list