vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Apr 3 18:26:00 2016 +0300| [2da34f3d59516cef1aa3d83dd4905f7837977fdf] | committer: Rémi Denis-Courmont
http: helper for HTTP Basic authorization (refs #16166) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2da34f3d59516cef1aa3d83dd4905f7837977fdf --- modules/access/http/message.c | 39 +++++++++++++++++++++++++++++++++++++++ modules/access/http/message.h | 17 +++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/modules/access/http/message.c b/modules/access/http/message.c index 7bea981..b3dd48a 100644 --- a/modules/access/http/message.c +++ b/modules/access/http/message.c @@ -32,6 +32,7 @@ #include <vlc_common.h> #include <vlc_http.h> +#include <vlc_strings.h> #include "message.h" #include "h2frame.h" @@ -901,3 +902,41 @@ int vlc_http_msg_add_cookies(struct vlc_http_msg *m, } return val; } + +int vlc_http_msg_add_creds_basic(struct vlc_http_msg *m, bool proxy, + const char *username, const char *password) +{ + char *str, *token; + int ret; + unsigned char c; + + /* CTL characters and colons not permitted in username */ + for (size_t len = 0; (c = username[len]) != '\0'; len++) + if (c < 32 || c == 127 || c == ':') + { + errno = EINVAL; + return -1; + } + + /* CTL characters not permitted in password */ + for (size_t len = 0; (c = password[len]) != '\0'; len++) + if (c < 32 || c == 127) + { + errno = EINVAL; + return -1; + } + + ret = asprintf(&str, "%s:%s", username, password); + if (unlikely(ret < 0)) + return -1; + + token = vlc_b64_encode_binary((unsigned char *)str, ret); + free(str); + if (unlikely(token == NULL)) + return -1; + + ret = vlc_http_msg_add_header(m, proxy ? "Proxy-Authorization" : + "Authorization", "Basic %s", token); + free(token); + return ret; +} diff --git a/modules/access/http/message.h b/modules/access/http/message.h index 10b7f11..302184e 100644 --- a/modules/access/http/message.h +++ b/modules/access/http/message.h @@ -149,6 +149,23 @@ int vlc_http_msg_add_cookies(struct vlc_http_msg *, struct vlc_http_cookie_jar_t *); /** + * Adds Basic credentials. + * + * Formats a plain username and password pair using HTTP Basic (RFC7617) + * syntax. + * + * @param proxy true for proxy authentication, + * false for origin server authentication + * @param username null-terminated username + * @param password null-terminated password + * @return 0 on success, -1 on out-of-memory (ENOMEM) or if username or + * password are invalid (EINVAL). + */ +int vlc_http_msg_add_creds_basic(struct vlc_http_msg *, bool proxy, + const char *username, const char *password); + + +/** * Looks up an header field. * * Finds an HTTP header field by (case-insensitive) name inside an HTTP _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
