Fazendo Backup dos App Profiles
Tags: veracode, beginners, tutorial, security
Published: 2023-03-30 17:34:07

Utilizando o Wrapper, podemos fazer o download dos relatórios de falhas disponíveis na plataforma. A ideia desse artigo é demonstrar como escrever um script para entrar em todos os perfis e fazer o download de um PDF com o ultimo relatório detalhado. 

Caso queira fazer isso para times específicos, utilize um usuário que tenha acesso aos times que quer fazer o backup.  

Estou usando a combinação do Wrapper + Powershell rodando no Windows, mas pode facilmente se aproveitar da estrutura e converter para Shell (ou apenas instalar o Powershell for Linux).

**Backup Geral**
Nesse primeiro modelo, vamos fazer o backup de todos os projetos que o usuário tem acesso. No script, coloquei como parâmetro adicional a pasta onde quer salvar esse backup, mas deixando o Desktop como opção padrão. 

Para utilizar ele corretamente, precisamos ter as ferramentas da Veracode [configuradas no Windows](https://dev.to/m3corp/veracode-windows-configurando-credenciais-wrapper-e-pipeline-scan-23pn). 

Nosso script vai basicamente:
1. Receber a lista de todos os projetos que o usuário tem acesso
2. Converter todos os nomes em IDs
3. Para cada um dos projetos, vai pegar o ultimo ID de Build (o ultimo scan realizado)
4. Vai gerar um relatório detalhado e salvar na pasta escolhida

Traduzindo isso para código, temos:
```
param (
    [parameter(position = 0)]
    $pastaBackup = [Environment]::GetFolderPath("Desktop")
)

# Recebe a lista de todos os nomes e IDs
[xml]$listaPerfisApp = $(VeracodeAPI.exe -action GetAppList)
$nomesApps = $listaPerfisApp.applist.app.app_name
$idApps = $listaPerfisApp.applist.app.app_id

# Inicializa o índice
[int]$indice = 0

# Valida se existe algum nome com o prefixo
foreach ($nomeApp in $nomesApps) {
    $appID = $idApps[$indice]
    [xml]$buildINFO = $(VeracodeAPI.exe -action getbuildinfo -appid $appID)
    $buildID = $buildINFO.buildinfo.build_id

    # Faz o Backup
    VeracodeAPI.exe -action detailedreport -buildid "$buildID" -format pdf -outputfilepath "$pastaBackup\$nomeApp-$buildID.pdf"
    $indice = $indice + 1
}
```

**Como fazer filtrando pelo nome?**
Caso queira fazer para projetos específicos ou filtrar por algum conjunto de caracteres em comum nos projetos, podemos alterar ligeiramente e utilizar uma string de validação. 
Nesse exemplo, recebo ela como o primeiro parâmetro, e uso para buscar em cada um dos projetos:
```
param (
        [parameter(position=0,Mandatory=$True)]
        $validadorNome,
        [parameter(position=1)]
        $pastaBackup = [Environment]::GetFolderPath("Desktop")
)

# Recebe a lista de todos os nomes e IDs
[xml]$listaPerfisApp = $(VeracodeAPI.exe -action GetAppList)
$nomesApps = $listaPerfisApp.applist.app.app_name
$idApps = $listaPerfisApp.applist.app.app_id

# Inicializa o índice
[int]$indice = 0

# Valida se existe algum nome com o prefixo
foreach ($nomeApp in $nomesApps) {
    if ($nomeApp -like "*$validadorNome*") {
        $appID = $idApps[$indice]
        [xml]$buildINFO = $(VeracodeAPI.exe -action getbuildinfo -appid $appID)
        $buildID = $buildINFO.buildinfo.build_id

        # Faz o Backup
        VeracodeAPI.exe -action detailedreport -buildid "$buildID" -format pdf -outputfilepath "$pastaBackup\$nomeApp-$buildID.pdf"
    }
    $indice = $indice + 1
}
```