[httpd/spotify] Redirect to admin.html, remove old oauth interface

This commit is contained in:
chme 2017-08-28 21:14:35 +02:00
parent e4e5fd5d59
commit ecfea82234
3 changed files with 52 additions and 42 deletions

View File

@ -154,6 +154,8 @@ static int httpd_port;
struct stream_ctx *g_st; struct stream_ctx *g_st;
#endif #endif
static void
redirect_to_admin(struct evhttp_request *req);
static void static void
stream_end(struct stream_ctx *st, int failed) stream_end(struct stream_ctx *st, int failed)
@ -210,24 +212,16 @@ scrobble_cb(void *arg)
static void static void
oauth_interface(struct evhttp_request *req, const char *uri) oauth_interface(struct evhttp_request *req, const char *uri)
{ {
struct evbuffer *evbuf;
struct evkeyvalq query; struct evkeyvalq query;
const char *req_uri; const char *req_uri;
const char *ptr; const char *ptr;
char __attribute__((unused)) redirect_uri[256]; char __attribute__((unused)) redirect_uri[256];
char *errmsg;
int ret; int ret;
#ifdef HAVE_SPOTIFY_H
req_uri = evhttp_request_get_uri(req); req_uri = evhttp_request_get_uri(req);
evbuf = evbuffer_new();
if (!evbuf)
{
DPRINTF(E_LOG, L_HTTPD, "Could not alloc evbuf for oauth\n");
return;
}
evbuffer_add_printf(evbuf, "<H1>forked-daapd oauth</H1>\n\n");
memset(&query, 0, sizeof(struct evkeyvalq)); memset(&query, 0, sizeof(struct evkeyvalq));
ptr = strchr(req_uri, '?'); ptr = strchr(req_uri, '?');
@ -236,32 +230,38 @@ oauth_interface(struct evhttp_request *req, const char *uri)
ret = evhttp_parse_query_str(ptr + 1, &query); ret = evhttp_parse_query_str(ptr + 1, &query);
if (ret < 0) if (ret < 0)
{ {
evbuffer_add_printf(evbuf, "OAuth error: Could not parse parameters in callback (%s)\n", req_uri); DPRINTF(E_LOG, L_HTTPD, "OAuth error: Could not parse parameters in callback (%s)\n", req_uri);
httpd_send_error(req, HTTP_BADREQUEST, "Could not parse parameters in callback");
httpd_send_reply(req, HTTP_OK, "OK", evbuf, 0);
evbuffer_free(evbuf);
return; return;
} }
} }
#ifdef HAVE_SPOTIFY_H
snprintf(redirect_uri, sizeof(redirect_uri), "http://forked-daapd.local:%d/oauth/spotify", httpd_port);
if (strncmp(uri, "/oauth/spotify", strlen("/oauth/spotify")) == 0) if (strncmp(uri, "/oauth/spotify", strlen("/oauth/spotify")) == 0)
spotify_oauth_callback(evbuf, &query, redirect_uri); {
snprintf(redirect_uri, sizeof(redirect_uri), "http://forked-daapd.local:%d/oauth/spotify", httpd_port);
ret = spotify_oauth_callback(&query, redirect_uri, &errmsg);
if (ret < 0)
{
DPRINTF(E_LOG, L_HTTPD, "OAuth error: Could not parse parameters in callback (%s)\n", req_uri);
httpd_send_error(req, HTTP_INTERNAL, errmsg);
}
else else
spotify_oauth_interface(evbuf, redirect_uri); {
#else redirect_to_admin(req);
evbuffer_add_printf(evbuf, "<p>This version was built without modules requiring OAuth support</p>\n"); }
#endif
evbuffer_add_printf(evbuf, "<p><i>(sorry about this ugly interface)</i></p>\n");
evhttp_clear_headers(&query); evhttp_clear_headers(&query);
free(errmsg);
}
else
{
httpd_send_error(req, HTTP_NOTFOUND, NULL);
}
httpd_send_reply(req, HTTP_OK, "OK", evbuf, 0); #else
DPRINTF(E_LOG, L_HTTPD, "This version was built without modules requiring OAuth support\n");
evbuffer_free(evbuf); httpd_send_error(req, HTTP_NOTFOUND, "No modules with OAuth support");
#endif
} }
static void static void
@ -909,6 +909,18 @@ path_is_legal(char *path)
return strncmp(WEB_ROOT, path, strlen(WEB_ROOT)); return strncmp(WEB_ROOT, path, strlen(WEB_ROOT));
} }
/* Thread: httpd */
static void
redirect_to_admin(struct evhttp_request *req)
{
struct evkeyvalq *headers;
headers = evhttp_request_get_output_headers(req);
evhttp_add_header(headers, "Location", "/admin.html");
httpd_send_reply(req, HTTP_MOVETEMP, "Moved", NULL, HTTPD_SEND_NO_GZIP);
}
/* Thread: httpd */ /* Thread: httpd */
static void static void
redirect_to_index(struct evhttp_request *req, char *uri) redirect_to_index(struct evhttp_request *req, char *uri)
@ -1189,9 +1201,9 @@ httpd_gen_cb(struct evhttp_request *req, void *arg)
} }
req_uri = evhttp_request_get_uri(req); req_uri = evhttp_request_get_uri(req);
if (!req_uri) if (!req_uri || strcmp(req_uri, "/") == 0)
{ {
redirect_to_index(req, "/"); redirect_to_admin(req);
return; return;
} }

View File

@ -1824,30 +1824,30 @@ spotify_oauth_interface(struct evbuffer *evbuf, const char *redirect_uri)
} }
/* Thread: httpd */ /* Thread: httpd */
void int
spotify_oauth_callback(struct evbuffer *evbuf, struct evkeyvalq *param, const char *redirect_uri) spotify_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, char **errmsg)
{ {
const char *code; const char *code;
const char *err; const char *err;
char *user = NULL; char *user = NULL;
int ret; int ret;
*errmsg = NULL;
code = evhttp_find_header(param, "code"); code = evhttp_find_header(param, "code");
if (!code) if (!code)
{ {
evbuffer_add_printf(evbuf, "Error: Didn't receive a code from Spotify\n"); *errmsg = safe_asprintf("Error: Didn't receive a code from Spotify");
return; return -1;
} }
DPRINTF(E_DBG, L_SPOTIFY, "Received OAuth code: %s\n", code); DPRINTF(E_DBG, L_SPOTIFY, "Received OAuth code: %s\n", code);
evbuffer_add_printf(evbuf, "<p>Requesting access token from Spotify...\n");
ret = spotifywebapi_token_get(code, redirect_uri, &user, &err); ret = spotifywebapi_token_get(code, redirect_uri, &user, &err);
if (ret < 0) if (ret < 0)
{ {
evbuffer_add_printf(evbuf, "failed</p>\n<p>Error: %s</p>\n", err); *errmsg = safe_asprintf("Error: %s", err);
return; return -1;
} }
// Received a valid access token // Received a valid access token
@ -1866,11 +1866,9 @@ spotify_oauth_callback(struct evbuffer *evbuf, struct evkeyvalq *param, const ch
// Trigger scan after successful access to spotifywebapi // Trigger scan after successful access to spotifywebapi
library_exec_async(webapi_scan, NULL); library_exec_async(webapi_scan, NULL);
evbuffer_add_printf(evbuf, "ok, all done</p>\n");
listener_notify(LISTENER_SPOTIFY); listener_notify(LISTENER_SPOTIFY);
return; return 0;
} }
static void static void

View File

@ -45,8 +45,8 @@ spotify_artwork_get(struct evbuffer *evbuf, char *path, int max_w, int max_h);
void void
spotify_oauth_interface(struct evbuffer *evbuf, const char *redirect_uri); spotify_oauth_interface(struct evbuffer *evbuf, const char *redirect_uri);
void int
spotify_oauth_callback(struct evbuffer *evbuf, struct evkeyvalq *param, const char *redirect_uri); spotify_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, char **errmsg);
int int
spotify_login_user(const char *user, const char *password, char **errmsg); spotify_login_user(const char *user, const char *password, char **errmsg);