diff mbox

[FFmpeg-devel] avformat/ftp: add AVOptions for authentication

Message ID 20191026223732.305811-1-ffmpeg@fratti.ch
State New
Headers show

Commit Message

Nicolas Frattaroli Oct. 26, 2019, 10:37 p.m. UTC
This introduces two new AVOption options for the FTP protocol,
one named ftp-user to supply the username to be used for auth,
one named ftp-password to supply the password to be used for auth.

These are useful for when an API user does not wish to deal with
URL manipulation and percent encoding.

Setting them while also having credentials in the URL will use the
credentials from the URL. The rationale for this is that credentials
embedded in the URL are probably more specific to what the user is
trying to do than anything set by some API user.

Signed-off-by: Nicolas Frattaroli <ffmpeg@fratti.ch>
---
 doc/protocols.texi |  8 ++++++++
 libavformat/ftp.c  | 21 ++++++++++++++++-----
 2 files changed, 24 insertions(+), 5 deletions(-)

Comments

Marton Balint Nov. 3, 2019, 11:39 a.m. UTC | #1
On Sun, 27 Oct 2019, Nicolas Frattaroli wrote:

> This introduces two new AVOption options for the FTP protocol,
> one named ftp-user to supply the username to be used for auth,
> one named ftp-password to supply the password to be used for auth.
>
> These are useful for when an API user does not wish to deal with
> URL manipulation and percent encoding.
>
> Setting them while also having credentials in the URL will use the
> credentials from the URL. The rationale for this is that credentials
> embedded in the URL are probably more specific to what the user is
> trying to do than anything set by some API user.
>
> Signed-off-by: Nicolas Frattaroli <ffmpeg@fratti.ch>
> ---
> doc/protocols.texi |  8 ++++++++
> libavformat/ftp.c  | 21 ++++++++++++++++-----
> 2 files changed, 24 insertions(+), 5 deletions(-)

Thanks, applied.

Regards,
Marton

>
> diff --git a/doc/protocols.texi b/doc/protocols.texi
> index b03432e3e5..0e18a49dda 100644
> --- a/doc/protocols.texi
> +++ b/doc/protocols.texi
> @@ -228,6 +228,14 @@ Set timeout in microseconds of socket I/O operations used by the underlying low
> operation. By default it is set to -1, which means that the timeout is
> not specified.
> 
> +@item ftp-user
> +Set a user to be used for authenticating to the FTP server. This is overridden by the
> +user in the FTP URL.
> +
> +@item ftp-password
> +Set a password to be used for authenticating to the FTP server. This is overridden by
> +the password in the FTP URL, or by @option{ftp-anonymous-password} if no user is set.
> +
> @item ftp-anonymous-password
> Password used when login as anonymous user. Typically an e-mail address
> should be used.
> diff --git a/libavformat/ftp.c b/libavformat/ftp.c
> index 3adc04ee1f..e3cbe5f8f0 100644
> --- a/libavformat/ftp.c
> +++ b/libavformat/ftp.c
> @@ -69,6 +69,8 @@ typedef struct {
>     size_t dir_buffer_size;
>     size_t dir_buffer_offset;
>     int utf8;
> +    const char *option_user;                    /**< User to be used if none given in the URL */
> +    const char *option_password;                /**< Password to be used if none given in the URL */
> } FTPContext;
> 
> #define OFFSET(x) offsetof(FTPContext, x)
> @@ -78,6 +80,8 @@ static const AVOption options[] = {
>     {"timeout", "set timeout of socket I/O operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
>     {"ftp-write-seekable", "control seekability of connection during encoding", OFFSET(write_seekable), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
>     {"ftp-anonymous-password", "password for anonymous login. E-mail address should be used.", OFFSET(anonymous_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
> +    {"ftp-user", "user for FTP login. Overridden by whatever is in the URL.", OFFSET(option_user), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
> +    {"ftp-password", "password for FTP login. Overridden by whatever is in the URL.", OFFSET(option_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
>     {NULL}
> };
> 
> @@ -652,7 +656,7 @@ static int ftp_abort(URLContext *h)
> 
> static int ftp_connect(URLContext *h, const char *url)
> {
> -    char proto[10], path[MAX_URL_SIZE], credencials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
> +    char proto[10], path[MAX_URL_SIZE], credentials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
>     const char *tok_user = NULL, *tok_pass = NULL;
>     char *end = NULL, *newpath = NULL;
>     int err;
> @@ -665,17 +669,24 @@ static int ftp_connect(URLContext *h, const char *url)
>     s->features = NULL;
>
>     av_url_split(proto, sizeof(proto),
> -                 credencials, sizeof(credencials),
> +                 credentials, sizeof(credentials),
>                  hostname, sizeof(hostname),
>                  &s->server_control_port,
>                  path, sizeof(path),
>                  url);
> 
> -    tok_user = av_strtok(credencials, ":", &end);
> +    tok_user = av_strtok(credentials, ":", &end);
>     tok_pass = av_strtok(end, ":", &end);
>     if (!tok_user) {
> -        tok_user = "anonymous";
> -        tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
> +        if (!s->option_user) {
> +            tok_user = "anonymous";
> +            tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
> +        } else {
> +            tok_user = s->option_user;
> +        }
> +    }
> +    if (!tok_pass) {
> +        tok_pass = s->option_password;
>     }
>     s->user = av_strdup(tok_user);
>     s->password = av_strdup(tok_pass);
> -- 
> 2.23.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox

Patch

diff --git a/doc/protocols.texi b/doc/protocols.texi
index b03432e3e5..0e18a49dda 100644
--- a/doc/protocols.texi
+++ b/doc/protocols.texi
@@ -228,6 +228,14 @@  Set timeout in microseconds of socket I/O operations used by the underlying low
 operation. By default it is set to -1, which means that the timeout is
 not specified.
 
+@item ftp-user
+Set a user to be used for authenticating to the FTP server. This is overridden by the
+user in the FTP URL.
+
+@item ftp-password
+Set a password to be used for authenticating to the FTP server. This is overridden by
+the password in the FTP URL, or by @option{ftp-anonymous-password} if no user is set.
+
 @item ftp-anonymous-password
 Password used when login as anonymous user. Typically an e-mail address
 should be used.
diff --git a/libavformat/ftp.c b/libavformat/ftp.c
index 3adc04ee1f..e3cbe5f8f0 100644
--- a/libavformat/ftp.c
+++ b/libavformat/ftp.c
@@ -69,6 +69,8 @@  typedef struct {
     size_t dir_buffer_size;
     size_t dir_buffer_offset;
     int utf8;
+    const char *option_user;                    /**< User to be used if none given in the URL */
+    const char *option_password;                /**< Password to be used if none given in the URL */
 } FTPContext;
 
 #define OFFSET(x) offsetof(FTPContext, x)
@@ -78,6 +80,8 @@  static const AVOption options[] = {
     {"timeout", "set timeout of socket I/O operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
     {"ftp-write-seekable", "control seekability of connection during encoding", OFFSET(write_seekable), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
     {"ftp-anonymous-password", "password for anonymous login. E-mail address should be used.", OFFSET(anonymous_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
+    {"ftp-user", "user for FTP login. Overridden by whatever is in the URL.", OFFSET(option_user), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
+    {"ftp-password", "password for FTP login. Overridden by whatever is in the URL.", OFFSET(option_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
     {NULL}
 };
 
@@ -652,7 +656,7 @@  static int ftp_abort(URLContext *h)
 
 static int ftp_connect(URLContext *h, const char *url)
 {
-    char proto[10], path[MAX_URL_SIZE], credencials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
+    char proto[10], path[MAX_URL_SIZE], credentials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
     const char *tok_user = NULL, *tok_pass = NULL;
     char *end = NULL, *newpath = NULL;
     int err;
@@ -665,17 +669,24 @@  static int ftp_connect(URLContext *h, const char *url)
     s->features = NULL;
 
     av_url_split(proto, sizeof(proto),
-                 credencials, sizeof(credencials),
+                 credentials, sizeof(credentials),
                  hostname, sizeof(hostname),
                  &s->server_control_port,
                  path, sizeof(path),
                  url);
 
-    tok_user = av_strtok(credencials, ":", &end);
+    tok_user = av_strtok(credentials, ":", &end);
     tok_pass = av_strtok(end, ":", &end);
     if (!tok_user) {
-        tok_user = "anonymous";
-        tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
+        if (!s->option_user) {
+            tok_user = "anonymous";
+            tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
+        } else {
+            tok_user = s->option_user;
+        }
+    }
+    if (!tok_pass) {
+        tok_pass = s->option_password;
     }
     s->user = av_strdup(tok_user);
     s->password = av_strdup(tok_pass);