1.2: Sandboxing #7

Open
qpismont wants to merge 7 commits from 1.2 into main
Owner

Impl sandboxing for agentic working (only review job for this release)

Impl sandboxing for agentic working (only review job for this release)
qpismont added 1 commit 2026-07-31 22:07:32 +02:00
Move to multi crates project
ci/woodpecker/push/tests Pipeline was successful
15f619ccf7
Starting impl devcontainer spec
Author
Owner
@Herald
Herald reviewed 2026-07-31 22:08:27 +02:00
Herald left a comment
Collaborator

Review Feedback

5 issues found.


Summary

Le code ajouté est bien structuré et suit les bonnes pratiques Rust (utilisation de thiserror, serde, PathBuf, etc.). La fonctionnalité de parsing devcontainer est claire et bien testée. Cependant, quelques points méritent attention :

  • La sécurité du conteneur de développement (option label=disable).
  • La gestion des champs optionnels du schéma devcontainer (le champ build est obligatoire alors qu'il pourrait être absent).
  • La fonction first_existing_container_file renvoie un chemin par défaut qui échouera si aucun fichier n'existe, ce qui pourrait être amélioré.
  • Les tests pourraient être étendus pour couvrir la fonction asynchrone parse.
    Dans l'ensemble, le travail est de bonne qualité et prêt à être fusionné après ces ajustements.

Cost: $0.00146804

## Review Feedback ### 5 issues found. --- ### Summary Le code ajouté est bien structuré et suit les bonnes pratiques Rust (utilisation de `thiserror`, `serde`, `PathBuf`, etc.). La fonctionnalité de parsing devcontainer est claire et bien testée. Cependant, quelques points méritent attention : - La sécurité du conteneur de développement (option `label=disable`). - La gestion des champs optionnels du schéma devcontainer (le champ `build` est obligatoire alors qu'il pourrait être absent). - La fonction `first_existing_container_file` renvoie un chemin par défaut qui échouera si aucun fichier n'existe, ce qui pourrait être amélioré. - Les tests pourraient être étendus pour couvrir la fonction asynchrone `parse`. Dans l'ensemble, le travail est de bonne qualité et prêt à être fusionné après ces ajustements. --- ### Cost: $0.00146804
@@ -19,5 +19,6 @@
},
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/herald,type=bind",
"workspaceFolder": "/workspaces/herald",
"runArgs": ["--userns=keep-id", "--security-opt", "label=disable"],
Collaborator

L'option --security-opt label=disable désactive la sécurité SELinux, ce qui réduit l'isolation du conteneur. Pour un environnement de développement, cela peut être acceptable, mais il faut être conscient des implications de sécurité. Envisagez d'utiliser --security-opt label=type:container_runtime_t ou d'autres options moins permissives si possible.

L'option `--security-opt label=disable` désactive la sécurité SELinux, ce qui réduit l'isolation du conteneur. Pour un environnement de développement, cela peut être acceptable, mais il faut être conscient des implications de sécurité. Envisagez d'utiliser `--security-opt label=type:container_runtime_t` ou d'autres options moins permissives si possible.
qpismont marked this conversation as resolved
@@ -0,0 +14,4 @@
}
#[derive(Debug, Deserialize)]
pub struct DevContainerSchema {
Collaborator

Le champ build est obligatoire, mais le schéma standard devcontainer.json permet également d'utiliser image à la place de build. Si quelqu'un utilise image, la désérialisation échouera. Envisagez de rendre build optionnel avec #[serde(default)] et de gérer le cas où ni build ni image ne sont présents.

Le champ `build` est obligatoire, mais le schéma standard devcontainer.json permet également d'utiliser `image` à la place de `build`. Si quelqu'un utilise `image`, la désérialisation échouera. Envisagez de rendre `build` optionnel avec `#[serde(default)]` et de gérer le cas où ni `build` ni `image` ne sont présents.
qpismont marked this conversation as resolved
@@ -0,0 +94,4 @@
}
}
fn first_existing_container_file(base_dir: &Path) -> PathBuf {
Collaborator

Si aucun fichier Dockerfile ou Containerfile n'existe, la fonction retourne base_dir.join("Dockerfile"), ce qui échouera plus tard avec ContainerFileNotFound. Cela pourrait être plus explicite en retournant une Option<PathBuf> et en laissant l'appelant gérer l'absence de fichier. Sinon, le message d'erreur actuel est suffisant.

Si aucun fichier `Dockerfile` ou `Containerfile` n'existe, la fonction retourne `base_dir.join("Dockerfile")`, ce qui échouera plus tard avec `ContainerFileNotFound`. Cela pourrait être plus explicite en retournant une `Option<PathBuf>` et en laissant l'appelant gérer l'absence de fichier. Sinon, le message d'erreur actuel est suffisant.
qpismont marked this conversation as resolved
@@ -0,0 +102,4 @@
.unwrap_or_else(|| base_dir.join("Dockerfile"))
}
pub async fn parse(path: impl AsRef<Path>) -> Result<DevContainer, ParseError> {
Collaborator

La fonction parse est asynchrone, mais les tests unitaires ne la testent pas directement (ils testent TryFrom). Il serait bon d'ajouter un test asynchrone pour parse afin de couvrir le flux complet (lecture du fichier, désérialisation, conversion).

La fonction `parse` est asynchrone, mais les tests unitaires ne la testent pas directement (ils testent `TryFrom`). Il serait bon d'ajouter un test asynchrone pour `parse` afin de couvrir le flux complet (lecture du fichier, désérialisation, conversion).
qpismont marked this conversation as resolved
@@ -0,0 +127,4 @@
use std::fs;
#[test]
fn resolves_configured_containerfile_relative_to_devcontainer_file() {
Collaborator

Les tests sont synchrones et utilisent std::fs plutôt que tokio::fs. C'est acceptable pour l'instant, mais si l'implémentation venait à dépendre de fonctionnalités asynchrones (comme tokio::fs), les tests pourraient ne plus être représentatifs.

Les tests sont synchrones et utilisent `std::fs` plutôt que `tokio::fs`. C'est acceptable pour l'instant, mais si l'implémentation venait à dépendre de fonctionnalités asynchrones (comme `tokio::fs`), les tests pourraient ne plus être représentatifs.
qpismont marked this conversation as resolved
qpismont added 1 commit 2026-07-31 22:18:39 +02:00
Dockerfile field must be present
ci/woodpecker/push/tests Pipeline was successful
5b9d870b46
qpismont changed title from Sandboxing to 1.2: Sandboxing 2026-07-31 22:19:52 +02:00
qpismont added 1 commit 2026-07-31 22:21:16 +02:00
Update woodpecker rust job (1.96 => 1.97)
ci/woodpecker/push/tests Pipeline was successful
b3a0cb63e9
qpismont added 1 commit 2026-07-31 22:25:54 +02:00
Renforce woodpecker tests
ci/woodpecker/push/tests Pipeline failed
6a21c7d6c3
qpismont added 1 commit 2026-07-31 22:33:13 +02:00
Fix fmt
ci/woodpecker/push/tests Pipeline failed
f0e64e0c1d
qpismont added 1 commit 2026-07-31 22:33:56 +02:00
re fix fmt lol
ci/woodpecker/push/tests Pipeline failed
8c53bc0e20
qpismont added 1 commit 2026-07-31 22:39:59 +02:00
Fix clippy errors
ci/woodpecker/push/tests Pipeline was successful
a29051b0e4
qpismont requested review from Herald 2026-08-02 11:51:05 +02:00
qpismont removed review request for Herald 2026-08-02 11:51:13 +02:00
All checks were successful
ci/woodpecker/push/tests Pipeline was successful
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 1.2:1.2
git checkout 1.2
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: qpismont/herald#7