From 15bb9358bc4468143152597996e34ad75ec040ff Mon Sep 17 00:00:00 2001 From: nathaninline Date: Tue, 28 Jul 2026 11:43:40 +0200 Subject: [PATCH] v0.5.12 : la cle Crawl4AI quitte config.env pour un fichier dedie (0600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une cle en clair dans config.env finit dans les copier-coller de depannage. Elle vit desormais dans $JEAN_HOME/.crawl4ai_key en 0600, comme la cle de completion (.api_key) ; les installations qui l'avaient dans config.env sont migrees a la premiere lecture, et l'ecriture efface toute trace residuelle. Approche proposee par @feanor91 dans la PR #15 — merci a lui. --- cmd/jean/resource_windows_amd64.syso | Bin 8348 -> 8348 bytes cmd/jean/resource_windows_arm64.syso | Bin 8348 -> 8348 bytes cmd/jean/versioninfo.json | 6 ++-- internal/jean/backend_presets.go | 2 +- internal/jean/chat_internet.go | 41 ++++++++++++++++++++++++--- internal/jean/chat_internet_tools.go | 2 +- internal/jean/run.go | 3 +- internal/jean/web_api.go | 2 +- 8 files changed, 45 insertions(+), 11 deletions(-) diff --git a/cmd/jean/resource_windows_amd64.syso b/cmd/jean/resource_windows_amd64.syso index 9bc470df1568178e5e81a0fc15f1e7f92ec6a189..ae4bf6aab312dcc8e267b265d0e644a87349b36b 100644 GIT binary patch delta 36 ocmbQ^ILC2=lnf^i11kdv@N8C=5ocmF+H5Ts&IqI?%X2aU0Enaq3jhEB delta 36 ocmbQ^ILC2=lnf^~11kdvaBo(Y5ocmF+-xlu&IqI?%X2aU0El4+2LJ#7 diff --git a/cmd/jean/resource_windows_arm64.syso b/cmd/jean/resource_windows_arm64.syso index 3dbf881a20baec6ba155e5a95219eb7f898475ae..0cb3af09556da498f46e198b56252341625cef68 100644 GIT binary patch delta 36 ocmbQ^ILC2=lnf^i11kdv@N8C=5ocmF+H5Ts&IqI?%X2aU0Enaq3jhEB delta 36 ocmbQ^ILC2=lnf^~11kdvaBo(Y5ocmF+-xlu&IqI?%X2aU0El4+2LJ#7 diff --git a/cmd/jean/versioninfo.json b/cmd/jean/versioninfo.json index 1327e5a..28fe548 100644 --- a/cmd/jean/versioninfo.json +++ b/cmd/jean/versioninfo.json @@ -3,13 +3,13 @@ "FileVersion": { "Major": 0, "Minor": 5, - "Patch": 11, + "Patch": 12, "Build": 0 }, "ProductVersion": { "Major": 0, "Minor": 5, - "Patch": 11, + "Patch": 12, "Build": 0 }, "FileFlagsMask": "3f", @@ -25,7 +25,7 @@ "LegalCopyright": "Copyright (c) 2026 AJEAN contributors. MIT License.", "OriginalFilename": "jean.exe", "ProductName": "AJEAN", - "ProductVersion": "0.5.11", + "ProductVersion": "0.5.12", "Comments": "https://github.com/nathaninline/jean — projet open source (MIT)" }, "VarFileInfo": { diff --git a/internal/jean/backend_presets.go b/internal/jean/backend_presets.go index bc2fb60..4a9794e 100644 --- a/internal/jean/backend_presets.go +++ b/internal/jean/backend_presets.go @@ -201,7 +201,7 @@ func safePresetPath(name string) (string, error) { // paramètres de modèle) qui doivent survivre à un changement de preset. Sans ça, // écraser config.env avec le preset ré-imposerait le mode mémoire et effacerait // l'URL du serveur internet à chaque bascule — ce qui obligeait à tout remettre. -var preservedKeys = []string{"MEM_MODE", "CRAWL4AI_URL", "CRAWL4AI_KEY"} +var preservedKeys = []string{"MEM_MODE", "CRAWL4AI_URL"} // SwitchToPreset backs up the current config and copies the target into place, // then restarts the service. Les réglages « appareil » (preservedKeys) sont diff --git a/internal/jean/chat_internet.go b/internal/jean/chat_internet.go index 0ddec2e..3547cb9 100644 --- a/internal/jean/chat_internet.go +++ b/internal/jean/chat_internet.go @@ -40,10 +40,43 @@ func crawl4aiURL() string { return strings.TrimRight(u, "/") } -// crawl4aiKey renvoie la clé d'accès au serveur Crawl4AI (config.env -// CRAWL4AI_KEY), vide si le serveur est ouvert. Envoyée en « Authorization: -// Bearer … », ce qu'attend Crawl4AI quand l'authentification est activée. -func crawl4aiKey() string { return strings.TrimSpace(ReadConfig()["CRAWL4AI_KEY"]) } +// crawl4aiKey renvoie la clé d'accès au serveur Crawl4AI, vide si le serveur +// est ouvert. Envoyée en « Authorization: Bearer … », ce qu'attend Crawl4AI +// quand l'authentification est activée (CRAWL4AI_API_TOKEN côté serveur). +// +// Elle vit dans $JEAN_HOME/.crawl4ai_key (0600) et NON dans config.env : ce +// dernier est le fichier qu'on copie-colle pour demander de l'aide, une clé en +// clair dedans finit par fuiter. Même modèle que la clé de complétion +// (.api_key). Les installations qui l'avaient dans config.env sont migrées à +// la première lecture. +func crawl4aiKey() string { + if b, err := os.ReadFile(crawlKeyPath()); err == nil { + if k := strings.TrimSpace(string(b)); k != "" { + return k + } + } + // Migration depuis l'ancien emplacement (jean 0.5.11). + if k := strings.TrimSpace(ReadConfig()["CRAWL4AI_KEY"]); k != "" { + if err := writeCrawlKey(k); err == nil { + _ = SetConfigKey("CRAWL4AI_KEY", "") + } + return k + } + return "" +} + +// writeCrawlKey enregistre (clé non vide) ou efface (clé vide) la clé Crawl4AI. +func writeCrawlKey(key string) error { + _ = SetConfigKey("CRAWL4AI_KEY", "") // ne laisse rien traîner dans config.env + if key == "" { + if err := os.Remove(crawlKeyPath()); err != nil && !os.IsNotExist(err) { + return err + } + return nil + } + _ = os.MkdirAll(JeanHome(), 0o755) + return os.WriteFile(crawlKeyPath(), []byte(key+"\n"), 0o600) +} // crawlAuth pose l'en-tête d'authentification sur une requête vers Crawl4AI. // Sans clé configurée, la requête part telle quelle. diff --git a/internal/jean/chat_internet_tools.go b/internal/jean/chat_internet_tools.go index ec9af6e..9a6c632 100644 --- a/internal/jean/chat_internet_tools.go +++ b/internal/jean/chat_internet_tools.go @@ -289,7 +289,7 @@ func cmdInternet(args []string) error { return fmt.Errorf("usage: jean internet key (vide pour l'enlever : jean internet key \"\")") } k := strings.TrimSpace(args[1]) - if err := SetConfigKey("CRAWL4AI_KEY", k); err != nil { + if err := writeCrawlKey(k); err != nil { return err } reachMu.Lock() diff --git a/internal/jean/run.go b/internal/jean/run.go index e363e20..2c6e356 100644 --- a/internal/jean/run.go +++ b/internal/jean/run.go @@ -10,7 +10,7 @@ import ( "strings" ) -const Version = "0.5.11" +const Version = "0.5.12" // Main est le vrai main() du binaire (cmd/jean ne fait que l'appeler). func Main() { @@ -220,6 +220,7 @@ func mcpConfigPath() string { return filepath.Join(JeanHome(), "mcp.json") } func legacySkillsFlag() string { return filepath.Join(skillsDir(), ".enabled") } func legacyToolsFlag() string { return filepath.Join(JeanHome(), ".tools_enabled") } func apiKeyPath() string { return filepath.Join(JeanHome(), ".api_key") } +func crawlKeyPath() string { return filepath.Join(JeanHome(), ".crawl4ai_key") } func serviceName() string { if n := os.Getenv("JEAN_SERVICE"); n != "" { return n diff --git a/internal/jean/web_api.go b/internal/jean/web_api.go index 1913373..27bff1b 100644 --- a/internal/jean/web_api.go +++ b/internal/jean/web_api.go @@ -585,7 +585,7 @@ func handleInternet(w http.ResponseWriter, r *http.Request) { _ = json.NewDecoder(r.Body).Decode(&req) // Clé d'accès au serveur Crawl4AI : chaîne vide = on l'enlève. if req.Key != nil { - if err := SetConfigKey("CRAWL4AI_KEY", strings.TrimSpace(*req.Key)); err != nil { + if err := writeCrawlKey(strings.TrimSpace(*req.Key)); err != nil { sendJSON(w, 500, map[string]any{"ok": false, "error": err.Error()}) return }