diff --git a/README.md b/README.md index 9561a80df..f8ae01654 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/contrib/init.debian b/contrib/init.debian index 5c10bdf60..e1c6fab0b 100755 --- a/contrib/init.debian +++ b/contrib/init.debian @@ -24,6 +24,7 @@ YMPD_USER=nobody MPD_HOST=localhost MPD_PORT=6600 WEB_PORT=8080 +#DIGEST=--digest /path/to/htdigest # Exit if the package is not installed @@ -35,7 +36,7 @@ WEB_PORT=8080 # Load the VERBOSE setting and other rcS variables [ -f /etc/default/rcS ] && . /etc/default/rcS -DAEMON_OPT="--user $YMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT" +DAEMON_OPT="--user $YMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT $DIGEST" do_start() { diff --git a/contrib/ympd.default b/contrib/ympd.default index c7bbcdaa7..184b2ed0e 100644 --- a/contrib/ympd.default +++ b/contrib/ympd.default @@ -2,3 +2,4 @@ MPD_HOST=localhost MPD_PORT=6600 WEB_PORT=8080 YMPD_USER=nobody +#DIGEST=--digest /path/to/htdigest diff --git a/contrib/ympd.service b/contrib/ympd.service index 2289550f8..4969337b7 100644 --- a/contrib/ympd.service +++ b/contrib/ympd.service @@ -7,8 +7,9 @@ Environment=MPD_HOST=localhost Environment=MPD_PORT=6600 Environment=WEB_PORT=8080 Environment=YMPD_USER=nobody +Environment=DIGEST= EnvironmentFile=/etc/default/ympd -ExecStart=/usr/bin/ympd --user $YMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT +ExecStart=/usr/bin/ympd --user $YMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT $DIGEST Type=simple [Install] diff --git a/src/ympd.c b/src/ympd.c index afa25c661..b5f2a3d55 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,16 @@ static int server_callback(struct mg_connection *c, enum mg_event ev) { return callback_http(c); #endif case MG_AUTH: - return MG_TRUE; + // 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 ) { + result = mg_authorize_digest(c, fp); + fclose(fp); + } + } + return result; default: return MG_FALSE; } @@ -77,10 +91,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", required_argument, 0, 'd'}, {"host", required_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {"webport", required_argument, 0, 'w'}, @@ -90,9 +106,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 +133,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"