Commit ead3dc6a authored by Max Kellermann's avatar Max Kellermann

LocateUri: pass URI plugin kind, optionally disables plugin verify

Commit b3a45833 added a LocateUri() call to several playlist commands, which applied InputPlugin URI scheme verification to playlist URIs. This broke the SoundCloud playlist plugin which uses "soundcloud://" URIs for which no input plugin exists. This commit allows the caller to specify the kind of plugin which shall be used to verify the URI. Right now, only "input" is implemented; "storage" uses the "input" verification for now; and "playlist" has no verification at all (for now). Closes https://github.com/MusicPlayerDaemon/MPD/issues/528
parent 7d814cc8
...@@ -2,6 +2,8 @@ ver 0.21.8 (not yet released) ...@@ -2,6 +2,8 @@ ver 0.21.8 (not yet released)
* output * output
- httpd: add missing mutex lock - httpd: add missing mutex lock
- httpd: fix use-after-free bug - httpd: fix use-after-free bug
* playlist
- soundcloud: fix "Unsupported URI scheme" (0.21.6 regression)
* fix Bonjour bug * fix Bonjour bug
* fix build failure with GCC 9 * fix build failure with GCC 9
* fix build failure with -Ddatabase=false * fix build failure with -Ddatabase=false
......
...@@ -55,14 +55,26 @@ LocateFileUri(const char *uri, const Client *client ...@@ -55,14 +55,26 @@ LocateFileUri(const char *uri, const Client *client
} }
static LocatedUri static LocatedUri
LocateAbsoluteUri(const char *uri LocateAbsoluteUri(UriPluginKind kind, const char *uri
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, const Storage *storage , const Storage *storage
#endif #endif
) )
{ {
if (!uri_supported_scheme(uri)) switch (kind) {
throw std::runtime_error("Unsupported URI scheme"); case UriPluginKind::INPUT:
case UriPluginKind::STORAGE: // TODO: separate check for storage plugins
if (!uri_supported_scheme(uri))
throw std::runtime_error("Unsupported URI scheme");
break;
case UriPluginKind::PLAYLIST:
/* for now, no validation for playlist URIs; this is
more complicated because there are three ways to
identify which plugin to use: URI scheme, filename
suffix and MIME type */
break;
}
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
if (storage != nullptr) { if (storage != nullptr) {
...@@ -76,7 +88,8 @@ LocateAbsoluteUri(const char *uri ...@@ -76,7 +88,8 @@ LocateAbsoluteUri(const char *uri
} }
LocatedUri LocatedUri
LocateUri(const char *uri, const Client *client LocateUri(UriPluginKind kind,
const char *uri, const Client *client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, const Storage *storage , const Storage *storage
#endif #endif
...@@ -100,7 +113,7 @@ LocateUri(const char *uri, const Client *client ...@@ -100,7 +113,7 @@ LocateUri(const char *uri, const Client *client
#endif #endif
); );
else if (uri_has_scheme(uri)) else if (uri_has_scheme(uri))
return LocateAbsoluteUri(uri return LocateAbsoluteUri(kind, uri
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, storage , storage
#endif #endif
......
...@@ -41,6 +41,12 @@ class Client; ...@@ -41,6 +41,12 @@ class Client;
class Storage; class Storage;
#endif #endif
enum class UriPluginKind {
INPUT,
STORAGE,
PLAYLIST,
};
struct LocatedUri { struct LocatedUri {
enum class Type { enum class Type {
/** /**
...@@ -84,7 +90,8 @@ struct LocatedUri { ...@@ -84,7 +90,8 @@ struct LocatedUri {
* that feature is disabled if this parameter is nullptr * that feature is disabled if this parameter is nullptr
*/ */
LocatedUri LocatedUri
LocateUri(const char *uri, const Client *client LocateUri(UriPluginKind kind,
const char *uri, const Client *client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, const Storage *storage , const Storage *storage
#endif #endif
......
...@@ -94,7 +94,8 @@ SongLoader::LoadSong(const char *uri_utf8) const ...@@ -94,7 +94,8 @@ SongLoader::LoadSong(const char *uri_utf8) const
assert(uri_utf8 != nullptr); assert(uri_utf8 != nullptr);
#endif #endif
const auto located_uri = LocateUri(uri_utf8, client const auto located_uri = LocateUri(UriPluginKind::INPUT,
uri_utf8, client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, storage , storage
#endif #endif
......
...@@ -218,7 +218,7 @@ handle_read_comments(Client &client, Request args, Response &r) ...@@ -218,7 +218,7 @@ handle_read_comments(Client &client, Request args, Response &r)
const char *const uri = args.front(); const char *const uri = args.front();
const auto located_uri = LocateUri(uri, &client const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
...@@ -331,7 +331,7 @@ handle_album_art(Client &client, Request args, Response &r) ...@@ -331,7 +331,7 @@ handle_album_art(Client &client, Request args, Response &r)
const char *uri = args.front(); const char *uri = args.front();
size_t offset = args.ParseUnsigned(1); size_t offset = args.ParseUnsigned(1);
const auto located_uri = LocateUri(uri, &client const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
......
...@@ -99,7 +99,7 @@ handle_listfiles(Client &client, Request args, Response &r) ...@@ -99,7 +99,7 @@ handle_listfiles(Client &client, Request args, Response &r)
/* default is root directory */ /* default is root directory */
const auto uri = args.GetOptional(0, ""); const auto uri = args.GetOptional(0, "");
const auto located_uri = LocateUri(uri, &client const auto located_uri = LocateUri(UriPluginKind::STORAGE, uri, &client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
...@@ -219,7 +219,7 @@ handle_lsinfo(Client &client, Request args, Response &r) ...@@ -219,7 +219,7 @@ handle_lsinfo(Client &client, Request args, Response &r)
compatibility, work around this here */ compatibility, work around this here */
uri = ""; uri = "";
const auto located_uri = LocateUri(uri, &client const auto located_uri = LocateUri(UriPluginKind::INPUT, uri, &client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
......
...@@ -69,7 +69,8 @@ handle_save(Client &client, Request args, gcc_unused Response &r) ...@@ -69,7 +69,8 @@ handle_save(Client &client, Request args, gcc_unused Response &r)
CommandResult CommandResult
handle_load(Client &client, Request args, gcc_unused Response &r) handle_load(Client &client, Request args, gcc_unused Response &r)
{ {
const auto uri = LocateUri(args.front(), &client const auto uri = LocateUri(UriPluginKind::PLAYLIST, args.front(),
&client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
...@@ -99,7 +100,8 @@ handle_load(Client &client, Request args, gcc_unused Response &r) ...@@ -99,7 +100,8 @@ handle_load(Client &client, Request args, gcc_unused Response &r)
CommandResult CommandResult
handle_listplaylist(Client &client, Request args, Response &r) handle_listplaylist(Client &client, Request args, Response &r)
{ {
const auto name = LocateUri(args.front(), &client const auto name = LocateUri(UriPluginKind::PLAYLIST, args.front(),
&client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
...@@ -115,7 +117,8 @@ handle_listplaylist(Client &client, Request args, Response &r) ...@@ -115,7 +117,8 @@ handle_listplaylist(Client &client, Request args, Response &r)
CommandResult CommandResult
handle_listplaylistinfo(Client &client, Request args, Response &r) handle_listplaylistinfo(Client &client, Request args, Response &r)
{ {
const auto name = LocateUri(args.front(), &client const auto name = LocateUri(UriPluginKind::PLAYLIST, args.front(),
&client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
......
...@@ -83,7 +83,8 @@ handle_add(Client &client, Request args, Response &r) ...@@ -83,7 +83,8 @@ handle_add(Client &client, Request args, Response &r)
here */ here */
uri = ""; uri = "";
const auto located_uri = LocateUri(uri, &client const auto located_uri = LocateUri(UriPluginKind::INPUT, uri,
&client
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
, nullptr , nullptr
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment