From bde33d5aa7230f5850d372da110287a7f6febdc1 Mon Sep 17 00:00:00 2001 From: SuperBFG7 Date: Tue, 6 Oct 2015 20:17:28 +0200 Subject: [PATCH 1/2] added option for htdigest authentication --- README.md | 2 ++ src/ympd.c | 24 ++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9561a80..f8ae016 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ Run flags ``` Usage: ./ympd [OPTION]... + -d, --digest path to htdigest file for authorization + (realm ympd) [no authorization] -h, --host connect to mpd at host [localhost] -p, --port connect to mpd at port [6600] -w, --webport [ip:] listen interface/port for webserver [8080] diff --git a/src/ympd.c b/src/ympd.c index afa25c6..15fa1f9 100644 --- a/src/ympd.c +++ b/src/ympd.c @@ -38,7 +38,12 @@ void bye() force_exit = 1; } +char *gpass = NULL; + static int server_callback(struct mg_connection *c, enum mg_event ev) { + int result = MG_FALSE; + FILE *fp = NULL; + switch(ev) { case MG_CLOSE: mpd_close_handler(c); @@ -57,7 +62,15 @@ static int server_callback(struct mg_connection *c, enum mg_event ev) { return callback_http(c); #endif case MG_AUTH: - return MG_TRUE; + if ( gpass == NULL ) + return MG_TRUE; + else { + if ( (fp = fopen(gpass, "r")) != NULL ) { + result = mg_authorize_digest(c, fp); + fclose(fp); + } + } + return result; default: return MG_FALSE; } @@ -77,10 +90,12 @@ int main(int argc, char **argv) mg_set_option(server, "document_root", SRC_PATH); #endif + mg_set_option(server, "auth_domain", "ympd"); mpd.port = 6600; strcpy(mpd.host, "127.0.0.1"); static struct option long_options[] = { + {"digest", optional_argument, 0, 'd'}, {"host", required_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {"webport", required_argument, 0, 'w'}, @@ -90,9 +105,12 @@ int main(int argc, char **argv) {0, 0, 0, 0 } }; - while((n = getopt_long(argc, argv, "h:p:w:u:v", + while((n = getopt_long(argc, argv, "d:h:p:w:u:v", long_options, &option_index)) != -1) { switch (n) { + case 'd': + gpass = strdup(optarg); + break; case 'h': strncpy(mpd.host, optarg, sizeof(mpd.host)); break; @@ -114,6 +132,8 @@ int main(int argc, char **argv) break; default: fprintf(stderr, "Usage: %s [OPTION]...\n\n" + " -d, --digest \tpath to htdigest file for authorization\n" + " \t(realm ympd) [no authorization]\n" " -h, --host \t\tconnect to mpd at host [localhost]\n" " -p, --port \t\tconnect to mpd at port [6600]\n" " -w, --webport [ip:]\tlisten interface/port for webserver [8080]\n" From 686eb4f5d2d9cb61f6611a1bf80e5f44a072b710 Mon Sep 17 00:00:00 2001 From: SuperBFG7 Date: Thu, 15 Oct 2015 15:46:28 +0200 Subject: [PATCH 2/2] skip authorization for websockets, since mobile safari does not support it --- src/ympd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ympd.c b/src/ympd.c index 15fa1f9..7c63167 100644 --- a/src/ympd.c +++ b/src/ympd.c @@ -62,7 +62,8 @@ static int server_callback(struct mg_connection *c, enum mg_event ev) { return callback_http(c); #endif case MG_AUTH: - if ( gpass == NULL ) + // no auth for websockets since mobile safari does not support it + if ( (gpass == NULL) || (c->is_websocket) ) return MG_TRUE; else { if ( (fp = fopen(gpass, "r")) != NULL ) {