Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
This patch allows you to play any file on your local filesystem (that the MPD server can read) using the `file://` URI syntax.
diff --git a/src/client/ClientFile.cxx b/src/client/ClientFile.cxx
index 0382789..9c41d2c 100644
--- a/src/client/ClientFile.cxx
+++ b/src/client/ClientFile.cxx
@@ -33,19 +33,17 @@ Client::AllowFile(Path path_fs) const
throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied");
#else
- if (uid >= 0 && (uid_t)uid == geteuid())
- /* always allow access if user runs his own MPD
- instance */
- return;
-
- if (uid < 0)
- /* unauthenticated client */
- throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied");
-
const FileInfo fi(path_fs);
- if (fi.GetUid() != (uid_t)uid && (fi.GetMode() & 0444) != 0444)
- /* client is not owner */
- throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied");
+ /* Check to see if the MPD process has read privlidges on the
+ * requested file. */
+ if ((geteuid() == fi.GetUid() && (fi.GetMode() & 0400) == 0400) ||
+ (getegid() == fi.GetGid() && (fi.GetMode() & 0040) == 0040) ||
+ ((fi.GetMode() & 0004) == 0004)) {
+ return;
+ }
+
+ /* otherwise, we can't read these files */
+ throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied");
#endif
}
diff --git a/src/fs/FileInfo.hxx b/src/fs/FileInfo.hxx
index f82da87..ece97a0 100644
--- a/src/fs/FileInfo.hxx
+++ b/src/fs/FileInfo.hxx
@@ -113,6 +113,10 @@ public:
return st.st_uid;
}
+ gid_t GetGid() const {
+ return st.st_gid;
+ }
+
mode_t GetMode() const {
return st.st_mode;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment