MTP: Fix ownership and file permissions for transferred files and folders

All new files and folders are created with group sdcard_rw
Permissions for new files are 0664 and directories 0775

Change-Id: I6d508231150f687e2e529112fd47f10e30fa594f
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/jni/android_media_MtpServer.cpp b/media/jni/android_media_MtpServer.cpp
index 355a5eb..e6a3835 100644
--- a/media/jni/android_media_MtpServer.cpp
+++ b/media/jni/android_media_MtpServer.cpp
@@ -27,6 +27,7 @@
 #include "jni.h"
 #include "JNIHelp.h"
 #include "android_runtime/AndroidRuntime.h"
+#include "private/android_filesystem_config.h"
 
 #include "MtpServer.h"
 
@@ -65,7 +66,7 @@
             return false;
         }
 
-        MtpServer* server = new MtpServer(fd, mDatabasePath);
+        MtpServer* server = new MtpServer(fd, mDatabasePath, AID_SDCARD_RW, 0664, 0775);
         server->addStorage(mStoragePath);
 
         // temporary
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index cc6fdad..b9eeec5 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -113,10 +113,14 @@
     // MTP_FORMAT_PLS_PLAYLIST,
 };
 
-MtpServer::MtpServer(int fd, const char* databasePath)
+MtpServer::MtpServer(int fd, const char* databasePath,
+                    int fileGroup, int filePerm, int directoryPerm)
     :   mFD(fd),
         mDatabasePath(databasePath),
         mDatabase(NULL),
+        mFileGroup(fileGroup),
+        mFilePermission(filePerm),
+        mDirectoryPermission(directoryPerm),
         mSessionID(0),
         mSessionOpen(false),
         mSendObjectHandle(kInvalidObjectHandle),
@@ -536,10 +540,11 @@
 
   if (format == MTP_FORMAT_ASSOCIATION) {
         mode_t mask = umask(0);
-        int ret = mkdir((const char *)path, S_IRWXU | S_IRWXG | S_IRWXO);
+        int ret = mkdir((const char *)path, mDirectoryPermission);
         umask(mask);
         if (ret && ret != -EEXIST)
             return MTP_RESPONSE_GENERAL_ERROR;
+        chown((const char *)path, getuid(), mFileGroup);
     } else {
         mSendObjectFilePath = path;
         // save the handle for the SendObject call, which should follow
@@ -571,12 +576,19 @@
     if (mfr.fd < 0) {
         return MTP_RESPONSE_GENERAL_ERROR;
     }
+    fchown(mfr.fd, getuid(), mFileGroup);
+    // set permissions
+    mode_t mask = umask(0);
+    fchmod(mfr.fd, mFilePermission);
+    umask(mask);
+
     mfr.offset = 0;
     mfr.length = mSendObjectFileSize;
 
     // transfer the file
     ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
     close(mfr.fd);
+
     // FIXME - we need to delete mSendObjectHandle from the database if this fails.
     LOGV("MTP_RECEIVE_FILE returned %d", ret);
     mSendObjectHandle = kInvalidObjectHandle;
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
index 42261a9..25635af 100644
--- a/media/mtp/MtpServer.h
+++ b/media/mtp/MtpServer.h
@@ -41,6 +41,12 @@
 
     MtpSqliteDatabase*  mDatabase;
 
+    // group to own new files and folders
+    int                 mFileGroup;
+    // permissions for new files and directories
+    int                 mFilePermission;
+    int                 mDirectoryPermission;
+
     // current session ID
     MtpSessionID        mSessionID;
     // true if we have an open session and mSessionID is valid
@@ -61,7 +67,8 @@
     size_t              mSendObjectFileSize;
 
 public:
-                        MtpServer(int fd, const char* databasePath);
+                        MtpServer(int fd, const char* databasePath,
+                                    int fileGroup, int filePerm, int directoryPerm);
     virtual             ~MtpServer();
 
     void                addStorage(const char* filePath);
diff --git a/media/mtp/mtptest.cpp b/media/mtp/mtptest.cpp
index 9062494..af0f77f 100644
--- a/media/mtp/mtptest.cpp
+++ b/media/mtp/mtptest.cpp
@@ -27,6 +27,7 @@
 #include "MtpServer.h"
 #include "MtpStorage.h"
 #include "f_mtp.h"
+#include "private/android_filesystem_config.h"
 
 using namespace android;
 
@@ -76,7 +77,7 @@
     enable_usb_function("usb_mass_storage", false);
     enable_usb_function("mtp", true);
 
-    MtpServer   server(fd, "/data/data/mtp/mtp.db");
+    MtpServer   server(fd, "/data/data/mtp/mtp.db", AID_SDCARD_RW, 0664, 0775);
     server.addStorage(storagePath);
     server.scanStorage();
     server.run();