daemora 1.0.9 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.js CHANGED
@@ -871,14 +871,23 @@ app.get("/api/settings", (req, res) => {
871
871
  }
872
872
  }
873
873
 
874
- // Mask values for security
874
+ // Merge vault secrets (if unlocked) — vault takes priority
875
+ const vaultActive = secretVault.isUnlocked();
876
+ if (vaultActive) {
877
+ const vaultSecrets = secretVault.getAsEnv();
878
+ for (const key of Object.keys(vaultSecrets)) {
879
+ envVars[key] = vaultSecrets[key]; // vault overrides .env
880
+ }
881
+ }
882
+
883
+ // Uniform masking — never leak any characters
875
884
  const masked = {};
876
885
  for (const [key, val] of Object.entries(envVars)) {
877
886
  if (!val) { masked[key] = ""; continue; }
878
- masked[key] = val.length <= 4 ? "****" : val.slice(0, 4) + "*".repeat(Math.min(val.length - 4, 20));
887
+ masked[key] = "••••••••";
879
888
  }
880
889
 
881
- res.json({ vars: masked, available });
890
+ res.json({ vars: masked, available, vaultActive });
882
891
  });
883
892
 
884
893
  app.put("/api/settings", (req, res) => {
@@ -887,25 +896,52 @@ app.put("/api/settings", (req, res) => {
887
896
  return res.status(400).json({ error: "updates object is required" });
888
897
  }
889
898
 
890
- const envPath = join(__dirname, "..", ".env");
891
- let content = existsSync(envPath) ? readFileSync(envPath, "utf-8") : "";
899
+ const vaultActive = secretVault.isUnlocked();
900
+ const sensitivePattern = /KEY|TOKEN|SECRET|PASSWORD|PASSPHRASE|CREDENTIAL/i;
901
+
902
+ // Separate sensitive vs non-sensitive
903
+ const envUpdates = {};
904
+ const vaultUpdates = {};
892
905
 
893
906
  for (const [key, value] of Object.entries(updates)) {
894
- // Validate key format (alphanumeric + underscore only)
895
907
  if (!/^[A-Z][A-Z0-9_]*$/.test(key)) continue;
896
- const regex = new RegExp(`^${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}=.*$`, "m");
897
- if (regex.test(content)) {
898
- content = content.replace(regex, `${key}=${value}`);
908
+ if (vaultActive && sensitivePattern.test(key)) {
909
+ vaultUpdates[key] = value;
899
910
  } else {
900
- content = content.trimEnd() + `\n${key}=${value}\n`;
911
+ envUpdates[key] = value;
901
912
  }
902
- // Also update process.env so changes take effect without restart
913
+ // Always update process.env so changes take effect immediately
903
914
  process.env[key] = value;
904
915
  }
905
916
 
906
- writeFileSync(envPath, content, "utf-8");
917
+ // Write non-sensitive (or all if vault locked) to .env
918
+ if (Object.keys(envUpdates).length > 0 || (!vaultActive && Object.keys(vaultUpdates).length === 0)) {
919
+ const allEnvUpdates = vaultActive ? envUpdates : { ...envUpdates, ...vaultUpdates };
920
+ const envPath = join(__dirname, "..", ".env");
921
+ let content = existsSync(envPath) ? readFileSync(envPath, "utf-8") : "";
922
+ for (const [key, value] of Object.entries(allEnvUpdates)) {
923
+ const regex = new RegExp(`^${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}=.*$`, "m");
924
+ if (regex.test(content)) {
925
+ content = content.replace(regex, `${key}=${value}`);
926
+ } else {
927
+ content = content.trimEnd() + `\n${key}=${value}\n`;
928
+ }
929
+ }
930
+ writeFileSync(envPath, content, "utf-8");
931
+ }
932
+
933
+ // Write sensitive keys to vault
934
+ if (vaultActive && Object.keys(vaultUpdates).length > 0) {
935
+ for (const [key, value] of Object.entries(vaultUpdates)) {
936
+ secretVault.set(key, value);
937
+ }
938
+ }
939
+
940
+ const stored = vaultActive
941
+ ? { env: Object.keys(envUpdates), vault: Object.keys(vaultUpdates) }
942
+ : { env: Object.keys(updates).filter(k => /^[A-Z][A-Z0-9_]*$/.test(k)) };
907
943
 
908
- res.json({ message: `Updated ${Object.keys(updates).length} variable(s)`, updated: Object.keys(updates) });
944
+ res.json({ message: `Updated ${Object.keys(updates).length} variable(s)`, stored });
909
945
  });
910
946
 
911
947
  // --- User Profile endpoints ---