+
+ /* We need authorization for everything else than OPTIONS request */
+ if (strcmp(method, "OPTIONS") != 0 && strlen(raop->password)) {
+ const char *authorization;
+
+ authorization = http_request_get_header(request, "Authorization");
+ if (authorization) {
+ logger_log(conn->raop->logger, LOGGER_DEBUG, "Our nonce: %s", conn->nonce);
+ logger_log(conn->raop->logger, LOGGER_DEBUG, "Authorization: %s", authorization);
+ }
+ if (!digest_is_valid(realm, raop->password, conn->nonce, method, http_request_get_url(request), authorization)) {
+ char *authstr;
+ int authstrlen;
+
+ /* Allocate the authenticate string */
+ authstrlen = sizeof("Digest realm=\"\", nonce=\"\"") + sizeof(realm) + sizeof(conn->nonce) + 1;
+ authstr = malloc(authstrlen);
+
+ /* Concatenate the authenticate string */
+ memset(authstr, 0, authstrlen);
+ strcat(authstr, "Digest realm=\"");
+ strcat(authstr, realm);
+ strcat(authstr, "\", nonce=\"");
+ strcat(authstr, conn->nonce);
+ strcat(authstr, "\"");
+
+ /* Construct a new response */
+ require_auth = 1;
+ http_response_destroy(res);
+ res = http_response_init("RTSP/1.0", 401, "Unauthorized");
+ http_response_add_header(res, "WWW-Authenticate", authstr);
+ free(authstr);
+ logger_log(conn->raop->logger, LOGGER_DEBUG, "Authentication unsuccessful, sending Unauthorized");
+ } else {
+ logger_log(conn->raop->logger, LOGGER_DEBUG, "Authentication successful!");
+ }
+ }
+