[FFmpeg-cvslog] httpauth: Parse the stale field in digest auth

Martin Storsjö git at videolan.org
Wed Mar 14 03:54:16 CET 2012


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Mon Mar 12 13:59:36 2012 +0200| [8a3360d18ab148fad6b32b4a8e710f84cd9a45d2] | committer: Martin Storsjö

httpauth: Parse the stale field in digest auth

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8a3360d18ab148fad6b32b4a8e710f84cd9a45d2
---

 libavformat/httpauth.c |   10 ++++++++++
 libavformat/httpauth.h |    7 +++++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/libavformat/httpauth.c b/libavformat/httpauth.c
index 4383585..c1cf019 100644
--- a/libavformat/httpauth.c
+++ b/libavformat/httpauth.c
@@ -57,6 +57,9 @@ static void handle_digest_params(HTTPAuthState *state, const char *key,
     } else if (!strncmp(key, "qop=", key_len)) {
         *dest     =        digest->qop;
         *dest_len = sizeof(digest->qop);
+    } else if (!strncmp(key, "stale=", key_len)) {
+        *dest     =        digest->stale;
+        *dest_len = sizeof(digest->stale);
     }
 }
 
@@ -93,6 +96,7 @@ void ff_http_auth_handle_header(HTTPAuthState *state, const char *key,
             state->auth_type <= HTTP_AUTH_BASIC) {
             state->auth_type = HTTP_AUTH_BASIC;
             state->realm[0] = 0;
+            state->stale = 0;
             ff_parse_key_value(p, (ff_parse_key_val_cb) handle_basic_params,
                                state);
         } else if (av_stristart(value, "Digest ", &p) &&
@@ -100,10 +104,13 @@ void ff_http_auth_handle_header(HTTPAuthState *state, const char *key,
             state->auth_type = HTTP_AUTH_DIGEST;
             memset(&state->digest_params, 0, sizeof(DigestParams));
             state->realm[0] = 0;
+            state->stale = 0;
             ff_parse_key_value(p, (ff_parse_key_val_cb) handle_digest_params,
                                state);
             choose_qop(state->digest_params.qop,
                        sizeof(state->digest_params.qop));
+            if (!av_strcasecmp(state->digest_params.stale, "true"))
+                state->stale = 1;
         }
     } else if (!strcmp(key, "Authentication-Info")) {
         ff_parse_key_value(value, (ff_parse_key_val_cb) handle_digest_update,
@@ -237,6 +244,9 @@ char *ff_http_auth_create_response(HTTPAuthState *state, const char *auth,
 {
     char *authstr = NULL;
 
+    /* Clear the stale flag, we assume the auth is ok now. It is reset
+     * by the server headers if there's a new issue. */
+    state->stale = 0;
     if (!auth || !strchr(auth, ':'))
         return NULL;
 
diff --git a/libavformat/httpauth.h b/libavformat/httpauth.h
index d2a4a55..bd06449 100644
--- a/libavformat/httpauth.h
+++ b/libavformat/httpauth.h
@@ -41,6 +41,9 @@ typedef struct {
     char opaque[300];      /**< A server-specified string that should be
                              *  included in authentication responses, not
                              *  included in the actual digest calculation. */
+    char stale[10];        /**< The server indicated that the auth was ok,
+                             * but needs to be redone with a new, non-stale
+                             * nonce. */
     int nc;                /**< Nonce count, the number of earlier replies
                              *  where this particular nonce has been used. */
 } DigestParams;
@@ -62,6 +65,10 @@ typedef struct {
      * The parameters specifiec to digest authentication.
      */
     DigestParams digest_params;
+    /**
+     * Auth ok, but needs to be resent with a new nonce.
+     */
+    int stale;
 } HTTPAuthState;
 
 void ff_http_auth_handle_header(HTTPAuthState *state, const char *key,



More information about the ffmpeg-cvslog mailing list