Skip to content

Commit 7f7ab32

Browse files
committed
docs: documenta navegador de arquivos e sandbox de escrita (+ remove fallback os.execute)
- README.md / README.en.md / MANUAL.md: secao do navegador de arquivos explicando que escrita cross-resource exige add_filesystem_permission no server.cfg (sandbox do FiveM > 25770; sem wildcard, sem convar global) - remove o fallback de escrita via os.execute (confirmado que tambem nao contorna o sandbox e so adicionava overhead); escrita usa so SaveResourceFile
1 parent 5d65e34 commit 7f7ab32

4 files changed

Lines changed: 61 additions & 29 deletions

File tree

MANUAL.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,17 @@ Visualização da tela de jogadores em tempo real para monitoramento. Suporte a
5454
Sistema de logs com persistência em banco de dados, buffer em memória, webhooks Discord por categoria e filtros por resource. Configurável via painel sem reiniciar o resource.
5555

5656
### Recursos
57-
Listagem de todos os resources do servidor com controle de start/stop.
57+
Listagem de todos os resources do servidor com controle de **start/stop/restart**, ações rápidas por item, filtros por estado (rodando/parados) e um **navegador de arquivos**: explorar pastas, abrir e **editar arquivos de texto** em tempo real, além de criar e excluir arquivos/pastas.
58+
59+
> **Importante — escrita e o sandbox do FiveM.** A partir dos artifacts > 25770, o FiveM bloqueia por padrão a escrita de um resource em arquivos de **outro** resource (proteção contra malware). A **leitura/navegação funciona em todos os resources**, mas **salvar/criar/excluir** só funciona:
60+
> - nos arquivos do **próprio `mri_Qadmin`**; ou
61+
> - em resources liberados explicitamente no `server.cfg`:
62+
> ```
63+
> add_filesystem_permission mri_Qadmin write <nome_do_resource>
64+
> ```
65+
> Uma linha **por resource** (o FiveM não suporta wildcard). Depois **reinicie o `mri_Qadmin`** para reavaliar.
66+
>
67+
> Quando o resource não é gravável, o painel exibe um aviso **"somente leitura"** com a linha exata do `add_filesystem_permission` e desabilita os controles de escrita. A exclusão exige as permissões `qadmin.action.change_resource` **e** `qadmin.action.resource_delete`.
5868
5969
### Configurações
6070
Editor visual de configurações sem precisar editar arquivos. Altera clima, hora, tema e integrações.

README.en.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,29 @@ Master Admin (console bypass)
5757
| `mri_qadmin.debugperms [id]` | Show detailed permission debug for a player |
5858
| `mri_qadmin.inspectdb` | Inspect permission tables in the DB |
5959

60+
## Resource File Browser
61+
62+
The **Resources** page includes a browser to explore, open and **edit text files** of any resource, plus create/delete files and folders — straight from the panel.
63+
64+
### Writing and the FiveM sandbox (must read)
65+
66+
Since artifacts **> 25770**, FiveM **blocks by default** a resource from writing to **another** resource's files (anti-malware protection). This affects the browser:
67+
68+
- **Reading/browsing** works for **all** resources.
69+
- **Saving / creating / deleting** only works:
70+
- on **`mri_Qadmin`'s own** files; or
71+
- on resources **explicitly allowed** in `server.cfg`.
72+
73+
To allow editing a resource, add this to `server.cfg` (then restart `mri_Qadmin`):
74+
75+
```cfg
76+
add_filesystem_permission mri_Qadmin write resource_name
77+
```
78+
79+
> One line **per resource** — FiveM does **not** support wildcards (`*`), and there is **no** convar to disable the sandbox globally. Reverting to artifacts ≤ 25770 unlocks it but is a security regression and is not recommended.
80+
81+
When a resource isn't writable, the panel shows a **"read-only"** notice with the exact line to add and disables the write controls. Write actions require the `qadmin.action.change_resource` permission; deletion also requires `qadmin.action.resource_delete`.
82+
6083
## In-Game Commands
6184

6285
| Command | Requires | Description |

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,29 @@ Arquivo principal: `shared/config.lua`
5353
| `Config.PlayerActions` | `{}` | Ações específicas para jogadores |
5454
| `Config.OtherActions` | `{}` | Outras ações administrativas |
5555

56+
## Navegador de arquivos de recursos
57+
58+
A página **Recursos** inclui um navegador que permite explorar, abrir e **editar arquivos de texto** de qualquer resource, além de criar/excluir arquivos e pastas — direto pelo painel.
59+
60+
### Escrita e o sandbox do FiveM (obrigatório ler)
61+
62+
A partir dos artifacts **> 25770**, o FiveM **bloqueia por padrão** que um resource escreva em arquivos de **outro** resource (proteção contra malware). Isso afeta o navegador:
63+
64+
- **Ler/navegar** funciona em **todos** os resources.
65+
- **Salvar / criar / excluir** só funciona:
66+
- nos arquivos do **próprio `mri_Qadmin`**; ou
67+
- em resources **liberados explicitamente** no `server.cfg`.
68+
69+
Para liberar a edição de um resource, adicione no `server.cfg` (e reinicie o `mri_Qadmin`):
70+
71+
```cfg
72+
add_filesystem_permission mri_Qadmin write nome_do_resource
73+
```
74+
75+
> Uma linha **por resource** — o FiveM **não** suporta wildcard (`*`), e **não há** convar para desabilitar o sandbox globalmente. Reverter para artifacts ≤ 25770 destrava, mas é uma regressão de segurança e não é recomendado.
76+
77+
Quando um resource não é gravável, o painel mostra um aviso **"somente leitura"** com a linha exata a adicionar e desabilita os controles de escrita. As ações de escrita exigem a permissão `qadmin.action.change_resource`; a exclusão exige também `qadmin.action.resource_delete`.
78+
5679
## Comandos
5780

5881
| Comando | Quem pode usar | Descrição |

server/resources.lua

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -710,36 +710,12 @@ writtenMatches = function(target, text)
710710
return type(native) == 'string' and sameTextContent(native, text)
711711
end
712712

713-
-- Grava `text` no destino e confirma por releitura. Retorna true se gravou.
714-
-- 1) native SaveResourceFile — limpa; bloqueada cross-resource pelo sandbox.
715-
-- 2) fallback os.execute (copy/cp): escreve um temp DENTRO do mri_Qadmin (que
716-
-- e sempre gravavel) e copia via shell para o destino. O processo externo
717-
-- do shell NAO passa pela vfs do FiveM, contornando o sandbox.
713+
-- Grava `text` no destino via native SaveResourceFile e confirma por releitura.
714+
-- Escrita cross-resource e bloqueada pelo sandbox do FiveM (io cru e os.execute
715+
-- tambem nao contornam) — so funciona no proprio mri_Qadmin ou com
716+
-- add_filesystem_permission no server.cfg.
718717
attemptWrite = function(target, text)
719718
SaveResourceFile(target.resource, target.relative, text, #text)
720-
if writtenMatches(target, text) then
721-
return true
722-
end
723-
724-
-- Caminhos com metacaracteres de shell nao vao pro os.execute.
725-
if hasShellHazard(target.absolute) then
726-
return false
727-
end
728-
729-
local tmpRel = '.qadmin_write_tmp'
730-
SaveResourceFile(GetCurrentResourceName(), tmpRel, text, #text)
731-
local tmpAbs = normalizeSlashes(GetResourcePath(GetCurrentResourceName()) or '') .. '\\' .. tmpRel
732-
if hasShellHazard(tmpAbs) then
733-
os.remove(tmpAbs)
734-
return false
735-
end
736-
737-
local command = isWindows()
738-
and ('cmd /c copy /y %s %s >nul 2>nul'):format(cmdQuote(tmpAbs), cmdQuote(target.absolute))
739-
or ('cp -f %s %s >/dev/null 2>&1'):format(cmdQuote(tmpAbs), cmdQuote(target.absolute))
740-
os.execute(command)
741-
os.remove(tmpAbs)
742-
743719
return writtenMatches(target, text)
744720
end
745721

0 commit comments

Comments
 (0)