xtra-cli 1.0.5 → 1.0.6
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/dist/bin/xtra.js +2 -2
- package/dist/commands/access.js +1 -1
- package/dist/commands/admin.js +3 -3
- package/dist/commands/audit.js +1 -1
- package/dist/commands/branch.js +1 -1
- package/dist/commands/checkout.js +1 -1
- package/dist/commands/ci.js +10 -10
- package/dist/commands/diff.js +6 -6
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/env.js +2 -2
- package/dist/commands/export.js +2 -2
- package/dist/commands/generate.js +3 -3
- package/dist/commands/history.js +3 -3
- package/dist/commands/import.js +1 -1
- package/dist/commands/init.js +4 -4
- package/dist/commands/integration.js +7 -7
- package/dist/commands/jit-run.js +3 -3
- package/dist/commands/local.js +5 -5
- package/dist/commands/login.js +6 -6
- package/dist/commands/login.test.js +4 -4
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logs.js +3 -3
- package/dist/commands/project.js +1 -1
- package/dist/commands/rollback.js +1 -1
- package/dist/commands/rotate.js +2 -2
- package/dist/commands/run.js +5 -5
- package/dist/commands/secrets.js +5 -5
- package/dist/commands/service-account.js +7 -0
- package/dist/commands/simulate.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/template.js +4 -4
- package/dist/commands/ui.js +2 -2
- package/dist/commands/watch.js +8 -8
- package/dist/lib/api.js +1 -1
- package/dist/lib/api.test.js +1 -1
- package/dist/lib/audit.js +1 -1
- package/package.json +1 -1
package/dist/lib/audit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var J=Object.create;var
|
|
1
|
+
var J=Object.create;var d=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var V=(t,e)=>{for(var s in e)d(t,s,{get:e[s],enumerable:!0})},x=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of F(e))!q.call(t,o)&&o!==s&&d(t,o,{get:()=>e[o],enumerable:!(n=K(e,o))||n.enumerable});return t};var i=(t,e,s)=>(s=t!=null?J(G(t)):{},x(e||!t||!t.__esModule?d(s,"default",{value:t,enumerable:!0}):s,t)),z=t=>x(d({},"__esModule",{value:!0}),t);var W={};V(W,{loadAuditLogs:()=>y,logAudit:()=>M,saveAuditLogs:()=>l,syncAuditLogs:()=>Q});module.exports=z(W);var g=i(require("fs")),S=i(require("path")),D=require("uuid");var c=i(require("crypto")),b=i(require("conf")),A=require("node-machine-id"),I="aes-256-gcm",k=new b.default({projectName:"xtra-cli-crypto"});function C(){let t=k.get("masterKey");t||(t=c.default.randomBytes(32).toString("hex"),k.set("masterKey",t));let e=(0,A.machineIdSync)();return c.default.createHash("sha256").update(t+e).digest()}var U=t=>{let e=c.default.randomBytes(16),s=C(),n=c.default.createCipheriv(I,s,e),o=n.update(t,"utf8","hex");o+=n.final("hex");let a=n.getAuthTag();return{iv:e.toString("hex"),content:o,tag:a.toString("hex")}},R=t=>{let e=C(),s=Buffer.from(t.iv,"hex"),n=Buffer.from(t.tag,"hex"),o=c.default.createDecipheriv(I,e,s);o.setAuthTag(n);let a=o.update(t.content,"hex","utf8");return a+=o.final("utf8"),a};var L=i(require("conf"));var h="https://www.xtrasecurity.in/api",u=new L.default({projectName:"xtra-cli",defaults:{apiUrl:h}}),m=u.get("apiUrl");m&&!process.env.XTRA_API_URL&&(m.includes("localhost")||m.includes("xtra-security.vercel.app"))&&u.set("apiUrl",h);var p=()=>({...u.store,apiUrl:process.env.XTRA_API_URL||u.get("apiUrl")||h});var B=()=>u.get("token");var O=i(require("axios"));var T=i(require("fs")),P=i(require("path")),H=JSON.parse(T.readFileSync(P.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:t}=p(),e=B();return O.default.create({baseURL:t,headers:{"Content-Type":"application/json","X-CLI-Version":H.version,...e?{Authorization:`Bearer ${e}`}:{}}})},_={login:async(t,e,s)=>(await r().post("/auth/cli-login",{email:t,password:e,apiKey:s})).data,getSecrets:async(t,e,s="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets?branch=${s}`)).data,getSecretVersions:async(t,e,s="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(t,e,s,n,o="main")=>(await r().post(`/projects/${t}/envs/${e}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(t,e,s,n="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets/${s}?branch=${n}`)).data,syncLogs:async t=>(await r().post("/audit/cli-logs",{logs:t})).data,linkSecret:async(t,e,s,n,o,a)=>(await r().post(`/projects/${t}/envs/${e}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:a})).data,rotateSecret:async(t,e,s,n,o)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(t,e,s)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(t,e,s,n)=>{let o={format:t};return e&&(o.startDate=e),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:t==="csv"?"text":"json"})).data},requestAccess:async(t,e,s,n)=>(await r().post("/access/request",{projectId:t,secretId:n,reason:e,duration:s})).data,approveAccess:async(t,e)=>(await r().post("/access/approve",{requestId:t,decision:e})).data,listAccessRequests:async t=>{let{workspace:e}=p(),s=e?`&workspaceId=${e}`:"";return(await r().get(`/access/list?mode=${t}${s}`)).data},getAccessRequestStatus:async t=>(await r().get(`/access/request?id=${t}`)).data,getProjects:async()=>{let{workspace:t}=p(),e=t?`/project?workspaceId=${t}`:"/project";return(await r().get(e)).data},getBranches:async t=>(await r().get(`/branch?projectId=${t}`)).data,createBranch:async(t,e,s)=>(await r().post("/branch",{projectId:t,name:e,description:s})).data,deleteBranch:async t=>(await r().delete(`/branch/${t}`)).data,updateBranch:async(t,e)=>(await r().put("/branch",{id:t,...e})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async t=>{let e=t?`?teamId=${t}`:"";return(await r().get(`/admin/users${e}`)).data},setUserRole:async(t,e,s)=>(await r().put("/admin/users/role",{email:t,role:e,teamId:s})).data,getIntegrationStatus:async t=>(await r().get(`/integrations/${t}`)).data,getIntegrationRepos:async t=>(await r().get(`/integrations/${t}/sync`)).data.repos,syncSecretsToGithub:async t=>(await r().post("/integrations/github/sync",t)).data,exportKubernetesSecret:async(t,e)=>{let s=new URLSearchParams(e).toString();return(await r().get(`/projects/${t}/kubernetes?${s}`)).data},getSecretHistory:async(t,e,s)=>(await r().get(`/projects/${t}/envs/${e}/secrets/${s}/history`)).data,rollbackSecret:async(t,e,s,n)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(t,e,s,n,o)=>(await r().post(`/projects/${t}/envs/clone`,{fromEnv:e,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async t=>(await r().post("/jit/generate",t)).data,claimJitLink:async t=>(await r().post("/jit/claim",{token:t})).data,getJitInfo:async t=>(await r().get(`/jit/${t}`)).data,getServiceAccounts:async t=>(await r().get(`/projects/${t}/service-accounts`)).data,createServiceAccount:async(t,e)=>(await r().post(`/projects/${t}/service-accounts`,e)).data,deleteServiceAccount:async(t,e)=>(await r().delete(`/projects/${t}/service-accounts/${e}`)).data,getServiceAccountKeys:async(t,e)=>(await r().get(`/projects/${t}/service-accounts/${e}/keys`)).data,createServiceAccountKey:async(t,e,s,n)=>(await r().post(`/projects/${t}/service-accounts/${e}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(t,e,s)=>(await r().delete(`/projects/${t}/service-accounts/${e}/keys/${s}`)).data,post:async(t,e)=>(await r().post(t,e)).data};var w=S.default.join(process.cwd(),".xtra"),v=S.default.join(w,"audit.enc");function X(t){if(!t||typeof t!="object")return t;let e={...t},s=["password","token","secret","value","apiKey","secretValue"];for(let n of Object.keys(e))s.some(o=>n.toLowerCase().includes(o))&&(e[n]="[REDACTED]");return e}async function N(t){try{if(!p().token)return!1;let s={action:t.action,entity:"cli-project",entityId:t.projectId||"global",details:X(t.details),timestamp:t.timestamp,projectId:t.projectId};return await _.post("/audit/cli-logs",{logs:[s]}),!0}catch(e){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",e),!1}}function M(t,e,s,n){let o={id:(0,D.v4)(),timestamp:new Date().toISOString(),action:t,projectId:e,environment:s,details:n,synced:!1},a=y();a.push(o),l(a),N(o).then(j=>{if(j){o.synced=!0;let f=y(),$=f.findIndex(E=>E.id===o.id);$!==-1&&(f[$].synced=!0,l(f))}}).catch(()=>{})}function y(){if(!g.default.existsSync(v))return[];try{let t=g.default.readFileSync(v,"utf-8"),e=JSON.parse(t),s=R(e);return JSON.parse(s)}catch{return[]}}function l(t){g.default.existsSync(w)||g.default.mkdirSync(w,{recursive:!0});let e=JSON.stringify(t),s=U(e);g.default.writeFileSync(v,JSON.stringify(s),"utf-8")}async function Q(){let t=y(),e=t.filter(n=>!n.synced);if(e.length===0)return 0;let s=0;for(let n of e)await N(n)&&(n.synced=!0,s++);return s>0&&l(t),s}0&&(module.exports={loadAuditLogs,logAudit,saveAuditLogs,syncAuditLogs});
|