"""Dedicated Kubernetes renewal worker. Only sanitized outcome metadata is emitted.""" import base64,json,sys,time,urllib.request,urllib.error,urllib.parse from pathlib import Path BAO="http://openbao.openbao.svc.cluster.local:8200/v1" PI="http://privacyidea.mfa.svc.cluster.local:8080" ISSUER="platform/data/workloads/net-kingdom/keycape-factor-issuer" TARGET="platform/data/workloads/net-kingdom/keycape-factor-read" USER="keycape-factor-reader" PROVENANCE="RPF-WP-0040" class Failure(Exception):pass class NoRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self,*args,**kwargs):return None def http(url,body=None,headers=None,method=None,form=False): data=None headers=dict(headers or {}) if body is not None: data=(urllib.parse.urlencode(body) if form else json.dumps(body)).encode() headers["Content-Type"]="application/x-www-form-urlencoded" if form else "application/json" req=urllib.request.Request(url,data=data,headers=headers,method=method) try: with urllib.request.build_opener(NoRedirect()).open(req,timeout=15) as r: raw=r.read(1048577) if len(raw)>1048576:raise Failure() return r.status,json.loads(raw) if raw else {} except urllib.error.HTTPError as e:return e.code,{} def success(code,data): if code!=200 or not data.get("result",{}).get("status"):raise Failure() return data["result"]["value"] def run(): session=None;receipt={"success":False,"phase":"workload_login"} try: jwt=Path("/var/run/keycape-factor/token").read_text().strip() code,body=http(BAO+"/auth/kubernetes/login",{"role":"keycape-factor-renewer","jwt":jwt}) if code!=200:raise Failure() session=body["auth"]["client_token"];headers={"X-Vault-Token":session} receipt["phase"]="issuer_custody" code,body=http(BAO+"/"+ISSUER,headers=headers) if code!=200:raise Failure() issuer=body["data"]["data"] if issuer.get("REQUEST")!=PROVENANCE or issuer.get("USERNAME")!=USER:raise Failure() receipt["phase"]="provider_authentication" value=success(*http(PI+"/auth",{"username":USER,"password":issuer["PASSWORD"]},form=True)) if value.get("role")!="admin" or value.get("username")!=USER:raise Failure() token=value["token"];claims=json.loads(base64.urlsafe_b64decode(token.split('.')[1]+'==='));expiry=int(claims["exp"]) if not 3000) except Exception:pass finally: if session: try: code,_=http(BAO+"/auth/token/revoke-self",headers={"X-Vault-Token":session},method="POST") receipt["session_revoked"]=code in (200,204) except Exception:receipt["session_revoked"]=False if not receipt["session_revoked"]:receipt["success"]=False;receipt["phase"]="session_cleanup" return receipt if __name__=="__main__": receipt=run();print(json.dumps(receipt));raise SystemExit(0 if receipt["success"] else 1)