Mercurial > libavformat.hg
changeset 5220:cad276e8f96e libavformat
RTSP basic authentication, patch originally by Philip Coombes
(philip coombes zoneminder com), see "[PATCH]RTSP Basic Authentication"
thread on mailinglist.
author | rbultje |
---|---|
date | Thu, 17 Sep 2009 21:47:11 +0000 |
parents | 583eb737b1c4 |
children | 3fab66935e56 |
files | rtsp.c rtsp.h |
diffstat | 2 files changed, 26 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/rtsp.c Thu Sep 17 19:07:09 2009 +0000 +++ b/rtsp.c Thu Sep 17 21:47:11 2009 +0000 @@ -22,6 +22,7 @@ /* needed by inet_aton() */ #define _SVID_SOURCE +#include "libavutil/base64.h" #include "libavutil/avstring.h" #include "libavutil/intreadwrite.h" #include "avformat.h" @@ -855,6 +856,10 @@ snprintf(buf1, sizeof(buf1), "Session: %s\r\n", rt->session_id); av_strlcat(buf, buf1, sizeof(buf)); } + if (rt->auth_b64) + av_strlcatf(buf, sizeof(buf), + "Authorization: Basic %s\r\n", + rt->auth_b64); av_strlcat(buf, "\r\n", sizeof(buf)); dprintf(s, "Sending:\n%s--\n", buf); @@ -899,6 +904,7 @@ av_close_input_stream (rt->asf_ctx); rt->asf_ctx = NULL; } + av_freep(&rt->auth_b64); } static int @@ -1159,7 +1165,7 @@ AVFormatParameters *ap) { RTSPState *rt = s->priv_data; - char host[1024], path[1024], tcpname[1024], cmd[2048], *option_list, *option; + char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128], *option_list, *option; URLContext *rtsp_hd; int port, ret, err; RTSPMessageHeader reply1, *reply = &reply1; @@ -1168,8 +1174,18 @@ char real_challenge[64]; /* extract hostname and port */ - url_split(NULL, 0, NULL, 0, + url_split(NULL, 0, auth, sizeof(auth), host, sizeof(host), &port, path, sizeof(path), s->filename); + if (*auth) { + int auth_len = strlen(auth), b64_len = ((auth_len + 2) / 3) * 4 + 1; + + if (!(rt->auth_b64 = av_malloc(b64_len))) + return AVERROR(ENOMEM); + if (!av_base64_encode(rt->auth_b64, b64_len, auth, auth_len)) { + err = AVERROR(EINVAL); + goto fail; + } + } if (port < 0) port = RTSP_DEFAULT_PORT; @@ -1199,8 +1215,10 @@ /* open the tcp connexion */ snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); - if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0) - return AVERROR(EIO); + if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0) { + err = AVERROR(EIO); + goto fail; + } rt->rtsp_hd = rtsp_hd; rt->seq = 0; @@ -1305,6 +1323,7 @@ rtsp_close_streams(rt); av_freep(&content); url_close(rt->rtsp_hd); + av_freep(&rt->auth_b64); return err; }
--- a/rtsp.h Thu Sep 17 19:07:09 2009 +0000 +++ b/rtsp.h Thu Sep 17 21:47:11 2009 +0000 @@ -228,6 +228,9 @@ * of RTSPMessageHeader->real_challenge */ enum RTSPServerType server_type; + /** base64-encoded authorization lines (username:password) */ + char *auth_b64; + /** The last reply of the server to a RTSP command */ char last_reply[2048]; /* XXX: allocate ? */