refactor(fs)!: remove read_text_file and write_text_file commands (#3605)

`readTextFile` and `writeTextFile` now go through `read_file` and
`write_file`, so the `allow-read-text-file`, `deny-read-text-file`,
`allow-write-text-file` and `deny-write-text-file` permissions are gone;
grant `fs:allow-read-file` and `fs:allow-write-file` instead.
This commit is contained in:
Lucas Fernandes Nogueira
2026-09-22 06:04:53 -03:00
committed by GitHub
parent 120d00558e
commit 5c077a3812
13 changed files with 10 additions and 123 deletions
+6
View File
@@ -0,0 +1,6 @@
---
"fs": major
"fs-js": major
---
**Breaking:** Removed the `read_text_file` and `write_text_file` commands and their `allow-read-text-file`, `deny-read-text-file`, `allow-write-text-file` and `deny-write-text-file` permissions. `readTextFile` and `writeTextFile` now use the `read_file` and `write_file` commands, so grant `fs:allow-read-file` and `fs:allow-write-file` instead.
@@ -65,7 +65,7 @@
"fs:allow-rename", "fs:allow-rename",
"fs:allow-mkdir", "fs:allow-mkdir",
"fs:allow-remove", "fs:allow-remove",
"fs:allow-write-text-file", "fs:allow-write-file",
"fs:scope-download-recursive", "fs:scope-download-recursive",
"fs:scope-resource-recursive", "fs:scope-resource-recursive",
{ {
File diff suppressed because one or more lines are too long
-2
View File
@@ -86,12 +86,10 @@ const COMMANDS: &[&str] = &[
"truncate", "truncate",
"ftruncate", "ftruncate",
"write", "write",
"write_text_file",
"read_dir", "read_dir",
"read_file", "read_file",
"read", "read",
"open", "open",
"read_text_file",
"read_text_file_lines_next", "read_text_file_lines_next",
"seek", "seek",
"stat", "stat",
+2 -22
View File
@@ -781,16 +781,7 @@ async function readTextFile(
path: string | URL, path: string | URL,
options?: ReadFileOptions options?: ReadFileOptions
): Promise<string> { ): Promise<string> {
if (path instanceof URL && path.protocol !== 'file:') { const bytes = await readFile(path, options)
throw new TypeError('Must be a file URL.')
}
const arr = await invoke<ArrayBuffer | number[]>('plugin:fs|read_text_file', {
path: path instanceof URL ? path.toString() : path,
options
})
const bytes = arr instanceof ArrayBuffer ? arr : Uint8Array.from(arr)
return new TextDecoder(options?.encoding ?? 'utf-8').decode(bytes) return new TextDecoder(options?.encoding ?? 'utf-8').decode(bytes)
} }
@@ -1138,18 +1129,7 @@ async function writeTextFile(
data: string, data: string,
options?: WriteFileOptions options?: WriteFileOptions
): Promise<void> { ): Promise<void> {
if (path instanceof URL && path.protocol !== 'file:') { await writeFile(path, new TextEncoder().encode(data), options)
throw new TypeError('Must be a file URL.')
}
const encoder = new TextEncoder()
await invoke('plugin:fs|write_text_file', encoder.encode(data), {
headers: {
path: encodeURIComponent(path instanceof URL ? path.toString() : path),
options: JSON.stringify(options)
}
})
} }
/** /**
@@ -330,32 +330,6 @@ Denies the read_file command without any pre-configured scope.
<tr> <tr>
<td> <td>
`fs:allow-read-text-file`
</td>
<td>
Enables the read_text_file command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`fs:deny-read-text-file`
</td>
<td>
Denies the read_text_file command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`fs:allow-read-text-file-lines-next` `fs:allow-read-text-file-lines-next`
</td> </td>
@@ -668,32 +642,6 @@ Denies the write command without any pre-configured scope.
<tr> <tr>
<td> <td>
`fs:allow-write-text-file`
</td>
<td>
Enables the write_text_file command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`fs:deny-write-text-file`
</td>
<td>
Denies the write_text_file command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`fs:allow-app-read-recursive` `fs:allow-app-read-recursive`
</td> </td>
-1
View File
@@ -8,7 +8,6 @@ commands.allow = [
"read_file", "read_file",
"read", "read",
"open", "open",
"read_text_file",
"read_text_file_lines", "read_text_file_lines",
"read_text_file_lines_next", "read_text_file_lines_next",
"seek", "seek",
@@ -9,7 +9,6 @@ specific base directories.
permissions = [ permissions = [
"allow-read-dir", "allow-read-dir",
"allow-read-file", "allow-read-file",
"allow-read-text-file",
"allow-read-text-file-lines", "allow-read-text-file-lines",
"allow-read-text-file-lines-next", "allow-read-text-file-lines-next",
"allow-exists", "allow-exists",
-1
View File
@@ -7,7 +7,6 @@ commands.allow = [
"read_file", "read_file",
"read", "read",
"open", "open",
"read_text_file",
"read_text_file_lines", "read_text_file_lines",
"read_text_file_lines_next", "read_text_file_lines_next",
"seek", "seek",
-1
View File
@@ -13,5 +13,4 @@ commands.allow = [
"ftruncate", "ftruncate",
"write", "write",
"write_file", "write_file",
"write_text_file",
] ]
-1
View File
@@ -12,5 +12,4 @@ commands.allow = [
"ftruncate", "ftruncate",
"write", "write",
"write_file", "write_file",
"write_text_file",
] ]
-38
View File
@@ -605,26 +605,6 @@ pub struct ReadTextFileOptions {
encoding: Option<String>, encoding: Option<String>,
} }
// TODO, remove in v3, rely on `read_file` command instead
#[tauri::command]
pub async fn read_text_file<R: Runtime>(
webview: Webview<R>,
global_scope: GlobalScope<Entry>,
command_scope: CommandScope<Entry>,
path: SafeFilePath,
options: Option<BaseOptions>,
) -> CommandResult<tauri::ipc::Response> {
read_file_inner(
"read-text-file",
webview,
global_scope,
command_scope,
path,
options,
)
.await
}
#[tauri::command] #[tauri::command]
pub fn read_text_file_lines<R: Runtime>( pub fn read_text_file_lines<R: Runtime>(
webview: Webview<R>, webview: Webview<R>,
@@ -1167,24 +1147,6 @@ pub async fn write_file<R: Runtime>(
write_file_inner("write-file", webview, global_scope, command_scope, request).await write_file_inner("write-file", webview, global_scope, command_scope, request).await
} }
// TODO, remove in v3, rely on `write_file` command instead
#[tauri::command]
pub async fn write_text_file<R: Runtime>(
webview: Webview<R>,
global_scope: GlobalScope<Entry>,
command_scope: CommandScope<Entry>,
request: tauri::ipc::Request<'_>,
) -> CommandResult<()> {
write_file_inner(
"write-text-file",
webview,
global_scope,
command_scope,
request,
)
.await
}
#[tauri::command] #[tauri::command]
pub fn exists<R: Runtime>( pub fn exists<R: Runtime>(
webview: Webview<R>, webview: Webview<R>,
-2
View File
@@ -464,7 +464,6 @@ pub fn init<R: Runtime>() -> TauriPlugin<R, Option<config::Config>> {
commands::read_dir, commands::read_dir,
commands::read, commands::read,
commands::read_file, commands::read_file,
commands::read_text_file,
commands::read_text_file_lines, commands::read_text_file_lines,
commands::read_text_file_lines_next, commands::read_text_file_lines_next,
commands::remove, commands::remove,
@@ -477,7 +476,6 @@ pub fn init<R: Runtime>() -> TauriPlugin<R, Option<config::Config>> {
commands::ftruncate, commands::ftruncate,
commands::write, commands::write,
commands::write_file, commands::write_file,
commands::write_text_file,
commands::exists, commands::exists,
commands::size, commands::size,
commands::start_accessing_security_scoped_resource, commands::start_accessing_security_scoped_resource,