From 0ca60fb017faec5b99019e249beb682d47b09ba7 Mon Sep 17 00:00:00 2001 From: nogueiraguh Date: Tue, 3 Mar 2026 16:01:18 -0300 Subject: [PATCH] fix: add key passphrase support for encrypted OCI private keys Private keys with passphrase caused EOFError in Docker containers since getpass cannot prompt without a TTY. Added optional "Key Passphrase" field to OCI credentials form. When provided, pass_phrase is written to the OCI config file so both the CLI and SDK can read the key without prompting. --- backend/app.py | 9 ++++++--- frontend/index.html | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/app.py b/backend/app.py index f5d0967..12ac719 100644 --- a/backend/app.py +++ b/backend/app.py @@ -393,6 +393,7 @@ async def save_oci( tenancy_name: str = Form(...), tenancy_ocid: str = Form(...), user_ocid: str = Form(...), fingerprint: str = Form(...), region: str = Form(...), compartment_id: str = Form(""), + key_passphrase: str = Form(""), private_key: UploadFile = File(...), public_key: Optional[UploadFile] = File(None), u = Depends(require("admin","user")) ): @@ -401,9 +402,11 @@ async def save_oci( kp.write_bytes(await private_key.read()); kp.chmod(0o600) if public_key: (cdir / "oci_api_key_public.pem").write_bytes(await public_key.read()) cfg_file = cdir / "config" - cfg_file.write_text( - f"[DEFAULT]\nuser={user_ocid}\nfingerprint={fingerprint}\n" - f"tenancy={tenancy_ocid}\nregion={region}\nkey_file={kp}\n") + cfg_content = (f"[DEFAULT]\nuser={user_ocid}\nfingerprint={fingerprint}\n" + f"tenancy={tenancy_ocid}\nregion={region}\nkey_file={kp}\n") + if key_passphrase: + cfg_content += f"pass_phrase={key_passphrase}\n" + cfg_file.write_text(cfg_content) cfg_file.chmod(0o600) with db() as c: c.execute("INSERT INTO oci_configs (id,user_id,tenancy_name,tenancy_ocid,user_ocid,fingerprint,region,key_file_path,compartment_id) VALUES (?,?,?,?,?,?,?,?,?)", diff --git a/frontend/index.html b/frontend/index.html index ac6454d..68e08f8 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -348,11 +348,14 @@ ${!S.ociCfg.length?'

Nenhuma credencia

+
Apenas se a chave privada for protegida por senha
+
`+rConfigLogs('oci')} async function sOci(){const fd=new FormData();fd.append('tenancy_name',document.getElementById('otn').value);fd.append('tenancy_ocid',document.getElementById('oto').value); fd.append('user_ocid',document.getElementById('ouo').value);fd.append('fingerprint',document.getElementById('ofp').value); fd.append('region',document.getElementById('org').value);fd.append('compartment_id',document.getElementById('ocp').value); + fd.append('key_passphrase',document.getElementById('okp').value||''); const sk=document.getElementById('osk').files[0];if(!sk)return sm('om','Selecione a chave privada','e');fd.append('private_key',sk); const pk=document.getElementById('opk').files[0];if(pk)fd.append('public_key',pk); const btn=document.getElementById('obtn');btn.disabled=true;btn.textContent='Salvando...';sm('om',' Salvando credencial...','i');