summaryrefslogtreecommitdiffstats
path: root/stream/realrtsp
diff options
context:
space:
mode:
authorrtogni <rtogni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-10-30 21:55:58 +0000
committerrtogni <rtogni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-10-30 21:55:58 +0000
commit13636fce07413d5b0e4356302753686dece3b595 (patch)
tree75c41ae50e840c0dce23f2b53785b32dc633ce9b /stream/realrtsp
parent1d8468125f937b42c0949f5e9a6ce2dd9808bf31 (diff)
downloadmpv-13636fce07413d5b0e4356302753686dece3b595.tar.bz2
mpv-13636fce07413d5b0e4356302753686dece3b595.tar.xz
Realrtsp authentication
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20543 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream/realrtsp')
-rw-r--r--stream/realrtsp/real.c49
-rw-r--r--stream/realrtsp/real.h3
2 files changed, 50 insertions, 2 deletions
diff --git a/stream/realrtsp/real.c b/stream/realrtsp/real.c
index 00c0c124b3..4a84997b35 100644
--- a/stream/realrtsp/real.c
+++ b/stream/realrtsp/real.c
@@ -41,6 +41,8 @@
#else
#include "libavutil/md5.h"
#endif
+#include "../http.h"
+#include "mp_msg.h"
/*
#define LOG
@@ -436,7 +438,8 @@ static int convert_timestamp(char *str, int *sec, int *msec) {
//! maximum size of the rtsp description, must be < INT_MAX
#define MAX_DESC_BUF (20 * 1024 * 1024)
-rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth) {
+rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth,
+ char *username, char *password) {
char *description=NULL;
char *session_id=NULL;
@@ -450,6 +453,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
unsigned int size;
int status;
uint32_t maxbandwidth = bandwidth;
+ char* authfield = NULL;
/* get challenge */
challenge1=strdup(rtsp_search_answers(rtsp_session,"RealChallenge1"));
@@ -462,6 +466,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
bandwidth = 10485800;
/* request stream description */
+rtsp_send_describe:
rtsp_schedule_field(rtsp_session, "Accept: application/sdp");
sprintf(buf, "Bandwidth: %u", bandwidth);
rtsp_schedule_field(rtsp_session, buf);
@@ -471,8 +476,50 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
rtsp_schedule_field(rtsp_session, "SupportsMaximumASMBandwidth: 1");
rtsp_schedule_field(rtsp_session, "Language: en-US");
rtsp_schedule_field(rtsp_session, "Require: com.real.retain-entity-for-setup");
+ if(authfield)
+ rtsp_schedule_field(rtsp_session, authfield);
status=rtsp_request_describe(rtsp_session,NULL);
+ if (status == 401) {
+ int authlen, b64_authlen;
+ char *authreq;
+ char* authstr = NULL;
+
+ if (authfield) {
+ mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authorization failed, check your credentials\n");
+ goto autherr;
+ }
+ if (!(authreq = rtsp_search_answers(rtsp_session,"WWW-Authenticate"))) {
+ mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: 401 but no auth request, aborting\n");
+ goto autherr;
+ }
+ if (!username) {
+ mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: auth required but no username supplied\n");
+ goto autherr;
+ }
+ if (!strstr(authreq, "Basic")) {
+ mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: authenticator not supported (%s)\n", authreq);
+ goto autherr;
+ }
+ authlen = strlen(username) + (password ? strlen(password) : 0) + 2;
+ authstr = malloc(authlen);
+ sprintf(authstr, "%s:%s", username, password ? password : "");
+ authfield = malloc(authlen*2+22);
+ strcpy(authfield, "Authorization: Basic ");
+ b64_authlen = base64_encode(authstr, authlen, authfield+21, authlen*2);
+ free(authstr);
+ if (b64_authlen < 0) {
+ mp_msg(MSGT_STREAM, MSGL_ERR, "realrtsp: base64 output overflow, this should never happen\n");
+ goto autherr;
+ }
+ authfield[b64_authlen+21] = 0;
+ goto rtsp_send_describe;
+ }
+autherr:
+
+ if (authfield)
+ free(authfield);
+
if ( status<200 || status>299 )
{
char *alert=rtsp_search_answers(rtsp_session,"Alert");
diff --git a/stream/realrtsp/real.h b/stream/realrtsp/real.h
index d0fe3fe306..447bb30de9 100644
--- a/stream/realrtsp/real.h
+++ b/stream/realrtsp/real.h
@@ -48,7 +48,8 @@ struct real_rtsp_session_t {
};
int real_get_rdt_chunk(rtsp_t *rtsp_session, char **buffer);
-rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth);
+rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth,
+ char *username, char *password);
struct real_rtsp_session_t *init_real_rtsp_session (void);
void free_real_rtsp_session (struct real_rtsp_session_t* real_session);