Skip to main content

fluidattacks_core_git/clone/
codecommit.rs

1use anyhow::Result;
2use std::path::Path;
3use tokio::process::Command;
4
5use super::{build_clone_args, reason, CloneOpts};
6use crate::aws;
7use crate::types::CredentialKind;
8
9pub async fn clone_codecommit(opts: &CloneOpts, dest: &Path) -> Result<()> {
10    let (arn, external_id, via) = match &opts.credentials.as_ref().map(|c| &c.kind) {
11        Some(CredentialKind::AwsRole {
12            arn,
13            external_id,
14            via,
15        }) => (arn.as_str(), external_id.as_str(), via.as_deref()),
16        _ => anyhow::bail!("expected AwsRole credentials for CodeCommit clone"),
17    };
18
19    let creds = aws::assume_role(arn, external_id, &opts.repo_url, via).await?;
20
21    let extra_config = vec!["-c".to_owned(), "http.sslVerify=false".to_owned()];
22    let args = build_clone_args(opts, &opts.repo_url, dest, &extra_config);
23
24    reason::run(
25        Command::new("git")
26            .args(&args)
27            .env("AWS_ACCESS_KEY_ID", &creds.access_key)
28            .env("AWS_SECRET_ACCESS_KEY", &creds.secret_key)
29            .env("AWS_SESSION_TOKEN", &creds.session_token)
30            .env("AWS_DEFAULT_REGION", &creds.region),
31        "CodeCommit",
32        &[],
33    )
34    .await
35}