#define MAX_PASSWORD_LEN 64
/* MD5 as hex fits here */
-#define MAX_NONCE_LEN 33
+#define MAX_NONCE_LEN 32
struct raop_s {
/* Callbacks for audio */
authorization = http_request_get_header(request, "Authorization");
if (authorization) {
+ logger_log(&conn->raop->logger, LOGGER_DEBUG, "Our nonce: %s\n", conn->nonce);
logger_log(&conn->raop->logger, LOGGER_DEBUG, "Authorization: %s\n", authorization);
}
- if (!digest_is_valid("AppleTV", raop->password, conn->nonce, method, authorization)) {
+ if (!digest_is_valid("AppleTV", raop->password, conn->nonce, method, http_request_get_url(request), authorization)) {
char *authstr;
int authstrlen;
http_response_add_header(res, "Apple-Jack-Status", "connected; type=analog");
challenge = http_request_get_header(request, "Apple-Challenge");
- if (challenge) {
+ if (!require_auth && challenge) {
char signature[MAX_SIGNATURE_LEN];
memset(signature, 0, sizeof(signature));
memcpy(datastr, data, datalen);
if (!strncmp(datastr, "volume: ", 8)) {
float vol = 0.0;
- sscanf(data+8, "%f", &vol);
+ sscanf(datastr+8, "%f", &vol);
raop_rtp_set_volume(conn->raop_rtp, vol);
}
}
+ free(datastr);
} else if (!strcmp(method, "FLUSH")) {
const char *rtpinfo;
int next_seq = -1;
}
}
+int
+raop_is_running(raop_t *raop)
+{
+ assert(raop);
+
+ return httpd_is_running(raop->httpd);
+}
+
int
raop_start(raop_t *raop, unsigned short *port, const char *hwaddr, int hwaddrlen, const char *password)
{
return -1;
}
- /* Validate password */
- if (strlen(password) > MAX_PASSWORD_LEN) {
- return -1;
+ memset(raop->password, 0, sizeof(raop->password));
+ if (password) {
+ /* Validate password */
+ if (strlen(password) > MAX_PASSWORD_LEN) {
+ return -1;
+ }
+
+ /* Copy password to the raop structure */
+ strncpy(raop->password, password, MAX_PASSWORD_LEN);
}
/* Copy hwaddr to the raop structure */
memcpy(raop->hwaddr, hwaddr, hwaddrlen);
raop->hwaddrlen = hwaddrlen;
- /* Copy password to the raop structure */
- strncpy(raop->password, password, MAX_PASSWORD_LEN);
-
return httpd_start(raop->httpd, port);
}