bczhc / some-tools

GNU General Public License v3.0
4 stars 2 forks source link

应用导入数据,创建的文件夹 系统文件管理器无法操作(删除,重命名,打开等)permission denied #269

Closed undefined303 closed 1 year ago

bczhc commented 1 year ago

问题的根源是文件的所有组被设置成和文件所有用户一样了,就像本应该的u0_a177 ext_data_rw变成了u0_a177 u0_a177,而文件的权限位的“其他”字段又全是0,导致系统文件管理器也无权访问文件。

初步的测试,API level 29下(也不知道有没有问题是鸿蒙的原因)无此问题,也不会出现文件所有组改变的问题。以下就以API 33的模拟器来说明问题。

应用数据导入使用的是Rust tar crate的unpack_in方法。导入前后的文件和目录权限变化如下:

 emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools $ ls -Rl
 .:
 total 8
 drwxrws--- 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 files

 ./files:
 total 8
-drwxrws--- 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 some-tools-app
+drwxr-xr-x 3 u0_a177 ext_data_rw 4096 2023-07-12 19:57 some-tools-app

 ./files/some-tools-app:
 total 8
-drwxrws--- 2 u0_a177 ext_data_rw 4096 2023-07-12 19:57 crash
+drwxr-xr-x 2 u0_a177 u0_a177 4096 2023-07-12 19:57 crash

 ./files/some-tools-app/crash:
 total 8
--rw-rw---- 1 u0_a177 ext_data_rw 3433 2023-07-12 19:57 crash_2023-07-12_19-57-09_1689163029979.txt
+-rw-rw---- 1 u0_a177 u0_a177 3433 2023-07-12 19:57 crash_2023-07-12_19-57-09_1689163029979.txt

我原以为是unpack_in方法会修改文件的uid和gid,但排查下来,原因其实是它改变了文件夹的权限位,然后当文件夹的权限从drwxrws---变到了drwxr-xr-x的时候,再在里面创建文件,文件的所有组会自动变成和所有用户同名,不知道为什么。因此就产生了上面的结果,adb shell的演示如下:

emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ mkdir d
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ touch d/1
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ chmod 755 d
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ touch d/2
emu64xa:/storage/emulated/0/Android/data/pers.zhc.tools/demo $ ls -lp d
total 8
-rw-rw---- 1 shell ext_data_rw 0 2023-07-12 20:09 1
-rw-rw---- 1 shell shell       0 2023-07-12 20:10 2

可以看到文件2就拥有了一样名字的所有组和所有用户。

https://github.com/bczhc/some-tools/commit/b34602dd9579de4ac888f0ce3465b16761047cc6 不再使用unpack_in,而是手动创建文件并写入,来修复问题。