mirror of
https://github.com/maxgoedjen/secretive.git
synced 2026-10-02 12:49:55 +02:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45359b5960 | ||
|
|
70e32dcf99 | ||
|
|
e9a0ff31d3 | ||
|
|
8577e7cbc3 | ||
|
|
85ba5a1a37 | ||
|
|
039dddd107 |
@@ -11,7 +11,7 @@ on:
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze (${{ matrix.language }})
|
||||
runs-on: ${{ (matrix.language == 'swift' && 'macos-26') || 'ubuntu-latest' }}
|
||||
runs-on: ${{ (matrix.language == 'swift' && 'xcode-27') || 'ubuntu-latest' }}
|
||||
permissions:
|
||||
security-events: write
|
||||
packages: read
|
||||
@@ -24,20 +24,15 @@ jobs:
|
||||
include:
|
||||
- language: actions
|
||||
build-mode: none
|
||||
# Disable this until CodeQL supports Xcode 26 builds.
|
||||
# - language: swift
|
||||
# build-mode: manual
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
build-mode: ${{ matrix.build-mode }}
|
||||
- if: matrix.build-mode == 'manual'
|
||||
name: "Select Xcode"
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- if: matrix.build-mode == 'manual'
|
||||
name: "Build"
|
||||
run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme Secretive CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO
|
||||
|
||||
@@ -6,7 +6,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-26
|
||||
runs-on: xcode-27
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: write
|
||||
@@ -25,8 +25,6 @@ jobs:
|
||||
APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}
|
||||
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||
run: ./.github/scripts/signing.sh
|
||||
- name: Set Environment
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- name: Update Build Number
|
||||
env:
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
|
||||
@@ -5,7 +5,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-26
|
||||
runs-on: xcode-27
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: write
|
||||
@@ -24,8 +24,6 @@ jobs:
|
||||
APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}
|
||||
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||
run: ./.github/scripts/signing.sh
|
||||
- name: Set Environment
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- name: Update Build Number
|
||||
env:
|
||||
RUN_ID: ${{ github.run_id }}
|
||||
|
||||
@@ -8,7 +8,7 @@ jobs:
|
||||
test:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: macos-26
|
||||
runs-on: xcode-27
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
@@ -21,8 +21,6 @@ jobs:
|
||||
APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}
|
||||
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||
run: ./.github/scripts/signing.sh
|
||||
- name: Set Environment
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- name: Test
|
||||
run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme PackageTests test
|
||||
# SPM doesn't seem to pick up on the tests currently?
|
||||
@@ -34,7 +32,7 @@ jobs:
|
||||
attestations: write
|
||||
artifact-metadata: write
|
||||
actions: read
|
||||
runs-on: macos-26
|
||||
runs-on: xcode-27
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
@@ -47,8 +45,6 @@ jobs:
|
||||
APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}
|
||||
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
||||
run: ./.github/scripts/signing.sh
|
||||
- name: Set Environment
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- name: Update Build Number
|
||||
env:
|
||||
TAG_NAME: ${{ github.ref }}
|
||||
|
||||
@@ -5,12 +5,10 @@ jobs:
|
||||
test:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: macos-26
|
||||
runs-on: xcode-27
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set Environment
|
||||
run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app
|
||||
- name: Test Main Packages
|
||||
run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme PackageTests test
|
||||
# SPM doesn't seem to pick up on the tests currently?
|
||||
|
||||
@@ -139,7 +139,7 @@ var localization: Resource {
|
||||
var swiftSettings: [PackageDescription.SwiftSetting] {
|
||||
[
|
||||
.swiftLanguageMode(.v6),
|
||||
// .treatAllWarnings(as: .error),
|
||||
.treatAllWarnings(as: .error),
|
||||
.strictMemorySafety()
|
||||
]
|
||||
}
|
||||
|
||||
@@ -490,8 +490,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Build Log"
|
||||
"state" : "translated",
|
||||
"value" : "Log de Build"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -675,8 +675,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "About Secretive"
|
||||
"state" : "translated",
|
||||
"value" : "Sobre o Secretive"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -860,8 +860,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Secretive is Open Source and MIT Licensed"
|
||||
"state" : "translated",
|
||||
"value" : "O Secretive é Open Source e distribuído sob a licença MIT"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -1045,8 +1045,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)"
|
||||
"state" : "translated",
|
||||
"value" : "Agradecimentos especiais aos nossos [Contribuidores](%1$(contributorsLink)@) e [Patrocinadores](%2$(sponsorsLink)@)"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -1230,8 +1230,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "View on GitHub"
|
||||
"state" : "translated",
|
||||
"value" : "Ver no GitHub"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -1416,7 +1416,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive não foi capaz de obter o SecretAgent para iniciar. Por favor tente reiniciar seu Mac e se isso não resolver, registre um problema em nosso GitHub."
|
||||
"value" : "O Secretive não foi capaz de iniciar o SecretAgent. Por favor, tente reiniciar seu Mac e, se isso não resolver, registre uma issue no GitHub."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -1601,7 +1601,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Desabilitar o Agente"
|
||||
"value" : "Desativar o Agente"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -2156,7 +2156,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Caminho do Socket"
|
||||
"value" : "Caminho do socket"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -2526,7 +2526,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Agente iniciando"
|
||||
"value" : "Iniciando Agente"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -2896,7 +2896,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "SecretAgent é um processo que é executado em segundo plano para assinar pedidos, então não há necessidade de manter Secretive aberto o tempo todo.\n\n**Secretive não funcionará corretamente a menos que o agente esteja instalado e executando.**"
|
||||
"value" : "O SecretAgent é um processo que roda em segundo plano para assinar pedidos, sem precisar manter o Secretive aberto o tempo todo.\n\n**O Secretive não funcionará corretamente a menos que o agente esteja instalado e rodando.**"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -3081,7 +3081,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Agent não está rodando"
|
||||
"value" : "O Agente não está rodando"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -3266,7 +3266,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "SecretAgent é um processo que roda em background para assinar requisições para que você não precise manter o Secretive aberto a todo momento.\n\n**Você pode fechar o Secretive e tudo continuará funcionando.**"
|
||||
"value" : "O SecretAgent é um processo que roda em segundo plano para assinar pedidos, sem precisar manter o Secretive aberto o tempo todo.\n\n**Você pode fechar o Secretive e tudo continuará funcionando.**"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -3451,7 +3451,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secret Agent está rodando"
|
||||
"value" : "O SecretAgent está rodando"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -3636,7 +3636,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Agent está rodando"
|
||||
"value" : "O Agente está rodando"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -3879,21 +3879,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"All" : {
|
||||
|
||||
},
|
||||
"Allow Connection Operations" : {
|
||||
|
||||
},
|
||||
"Allow Forwarding" : {
|
||||
|
||||
},
|
||||
"Allow Signing Operations" : {
|
||||
|
||||
},
|
||||
"Allowed Domains" : {
|
||||
|
||||
},
|
||||
"app_menu_help_button" : {
|
||||
"extractionState" : "manual",
|
||||
@@ -4390,8 +4375,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Later"
|
||||
"state" : "translated",
|
||||
"value" : "Depois"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -4576,7 +4561,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive necessita estar no seu diretório de Aplicações para funcionar corretamente. Por favor mova-o e abra novamente."
|
||||
"value" : "O Secretive precisa estar no seu diretório de Aplicativos para funcionar corretamente. Por favor, mova-o e abra novamente."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -4760,8 +4745,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Quit"
|
||||
"state" : "translated",
|
||||
"value" : "Encerrar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -4946,7 +4931,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive não está no diretório de Aplicações"
|
||||
"value" : "O Secretive não está no diretório de Aplicativos"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -5132,7 +5117,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "destravar segredo “%1$(secretName)@” for %2$(duration)@"
|
||||
"value" : "destrancar o segredo “%1$(secretName)@” por %2$(duration)@"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -5504,7 +5489,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "assinar requisição a partir do “%1$(appName)@” utilizando o segredo “%2$(secretName)@”"
|
||||
"value" : "assinar um pedido de “%1$(appName)@” usando o segredo “%2$(secretName)@”"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -5943,6 +5928,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Critical Options"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Opções críticas"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5954,6 +5945,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Extensions"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Extensões"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5965,6 +5962,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Key ID"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "ID da Chave"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5976,6 +5979,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Certificate Path"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Caminho do Certificado"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5987,6 +5996,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Principals"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Entidades Principais"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5998,6 +6013,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Serial Number"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Número de Série"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6009,6 +6030,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Public Key Fingerprint"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Impressão Digital da Chave Pública"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6020,6 +6047,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Signing CA Fingerprint"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Impressão Digital da AC de Assinatura"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6031,6 +6064,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Valid After"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Válido após"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6042,6 +6081,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Valid Until"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Válido até"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6053,6 +6098,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Validity Range"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Intervalo de validade"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6185,7 +6236,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Clique para Copiar"
|
||||
"value" : "Clique para copiar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -6740,7 +6791,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você mudar suas configurações de biometria de _qualquer forma_, incluindo adicionar uma nova impressão digital, esta chave não estará mais acessível."
|
||||
"value" : "Se você mudar suas configurações de biometria de _qualquer forma_, incluindo adicionar uma nova impressão digital, esta chave não será mais acessível."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -7295,7 +7346,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Isto é exibido ao final da sua chave pública. É geralmente um endereço de email."
|
||||
"value" : "Isso é exibido ao final da sua chave pública. É geralmente um endereço de email."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -7849,8 +7900,8 @@
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "Unavailable on this version of macOS"
|
||||
"state" : "translated",
|
||||
"value" : "Indisponível nessa versão do macOS"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -8035,7 +8086,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Aviso: Chaves ML-DSA são muito novas e não são suportadas por muitos servidores ainda. Por favor, verifique se o servidor que você estará utilizando esta chave aceita chaves ML-DSA."
|
||||
"value" : "Aviso: Chaves ML-DSA são muito novas e ainda não suportadas por vários servidores. Por favor, verifique se o servidor em que você usará essa chave aceita chaves ML-DSA."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -8590,7 +8641,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Autenticação não é requerida enquanto seu Mac estiver destravado, mas você será notificado quando um segredo for utilizado."
|
||||
"value" : "Nenhuma autenticação é solicitada enquanto seu Mac estiver desbloqueado, mas você será notificado quando um segredo for usado."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -9515,7 +9566,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Você será requerido a autenticar utilizando Touch ID, Apple Watch ou senha antes de cada uso."
|
||||
"value" : "Você será solicitado a autenticar usando Touch ID, Apple Watch ou senha a cada uso."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -9700,7 +9751,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Requer Autenticação"
|
||||
"value" : "Requer autenticação"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -9885,7 +9936,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Criar um Novo Segredo"
|
||||
"value" : "Criar um novo Segredo"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -10070,7 +10121,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Não Apagar"
|
||||
"value" : "Não apagar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -10440,7 +10491,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você deletar %1$(secretName)@, você não será permitido recuperá-lo. Digite “%2$(confirmSecretName)@” para confirmar."
|
||||
"value" : "Se você apagar %1$(secretName)@, não poderá recuperá-lo. Digite “%2$(confirmSecretName)@” para confirmar."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -10625,7 +10676,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Deletar %1$(name)@?"
|
||||
"value" : "Apagar %1$(name)@?"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -10995,7 +11046,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Renomear"
|
||||
"value" : "Salvar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -11180,7 +11231,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Criar um novo clicando aqui."
|
||||
"value" : "Crie um novo clicando aqui."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -11550,7 +11601,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Parece que você pode ter atualizado recentemente o macOS. Às vezes, isto coloca o Secure Enclave em um estado estranho, e talvez você precise reiniciar seu Mac antes que as coisas comecem a funcionar novamente."
|
||||
"value" : "Parece que você pode ter atualizado o macOS recentemente. Às vezes, isso coloca o Secure Enclave em um estado estranho, e talvez você precise reiniciar seu Mac antes que as coisas comecem a funcionar novamente."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -11735,7 +11786,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Credenciais faltando?"
|
||||
"value" : "Segredos faltando?"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -11920,7 +11971,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Utilize sua ferramenta de gestão de Smart Card para criar um segredo."
|
||||
"value" : "Use a ferramenta de gestão do seu Smart Card para criar um segredo."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -12105,7 +12156,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive suporta chaves EC256, EC384, RSA1024 e RSA2048."
|
||||
"value" : "O Secretive suporta chaves EC256, EC384 e RSA2048."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -12348,9 +12399,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"example.com" : {
|
||||
|
||||
},
|
||||
"export SSH_AUTH_SOCK=%@" : {
|
||||
"localizations" : {
|
||||
@@ -13206,7 +13254,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Há uma lista de instruções para aplicativos no GitHub, mantida pela comunidade. Se o aplicativo que você está procurando não é suportado, registre um ticket para que a comunidade possa ajudar."
|
||||
"value" : "Há uma lista de instruções para aplicativos no GitHub, mantida pela comunidade. Se o aplicativo que você está procurando não é suportado, registre uma issue e a comunidade deve conseguir ajudar."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -13391,7 +13439,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Há uma lista de instruções para aplicativos no GitHub, mantida pela comunidade. Se o aplicativo que você está procurando não é suportado, registre um ticket para que a comunidade possa ajudar."
|
||||
"value" : "Há uma lista de instruções para shells no GitHub, mantida pela comunidade. Se o shell que você está procurando não é suportado, registre uma issue e a comunidade deve conseguir ajudar."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -13459,6 +13507,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "your_email@example.com"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "seu_email@exemplo.com.br"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -13470,6 +13524,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "The email address you set when you configured git (visible in gitconfig)."
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "O endereço de email que você definiu quando configurou o git (visível no gitconfig)."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -13481,6 +13541,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Email Address"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Endereço de email"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -13610,7 +13676,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Você precisará criar uma Credencial antes de configurar esta ação."
|
||||
"value" : "Você precisará criar um Segredo antes de configurar essa ação."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -13795,7 +13861,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Configurar Usando Credencial"
|
||||
"value" : "Configurar usando Segredo"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -13980,7 +14046,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sem Credenciais"
|
||||
"value" : "Sem Segredo"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -14165,7 +14231,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Credencial"
|
||||
"value" : "Segredo"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -14350,7 +14416,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Você pode configurar mais de uma ferramenta, eles geralmente não interferem uns com os outros."
|
||||
"value" : "Você pode configurar mais de uma ferramenta, elas geralmente não interferem umas com as outras."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -14905,7 +14971,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você estiver tentando registrar seus commits no git, configure o Git Signing."
|
||||
"value" : "Se você estiver tentando assinar seus commits no git, configure Assinatura no Git."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -15090,7 +15156,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você está tentando configurar qualquer coisa em sua linha de comando para usar com Secretive, configure seu shell."
|
||||
"value" : "Se você está tentando configurar qualquer coisa em sua linha de comando para usar o Secretive, configure seu shell."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -15275,7 +15341,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você não sabia qual shell você usa e não alterou, você provavelmente está usando `%(shellName)@`."
|
||||
"value" : "Se você não sabe qual shell usa e não o alterou, você provavelmente está usando `%(shellName)@`."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -15645,7 +15711,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Configurando Ferramentas para Secretive"
|
||||
"value" : "Configurando ferramentas para o Secretive"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -15830,7 +15896,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "A maioria das ferramentas tentará procurar chaves SSH no disco em `~/.ssh`. Para usar o Secretive, precisamos configurar essas ferramentas para comunicar com o Secretive."
|
||||
"value" : "A maioria das ferramentas tentará procurar chaves SSH no disco em `~/.ssh`. Para usar o Secretive, precisamos configurar essas ferramentas para falarem com o Secretive ao invés disso."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -16015,7 +16081,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "O que devo Configurar?"
|
||||
"value" : "O que devo configurar?"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -17126,7 +17192,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Arquivo de Configuração"
|
||||
"value" : "Arquivo de configuração"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -17496,7 +17562,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Você pode pedir ao SSH para usar uma chave específica para um determinado host. Consulte a documentação na web para mais detalhes."
|
||||
"value" : "Você pode dizer ao SSH para usar uma chave específica com determinado host. Consulte a documentação na web para mais detalhes."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -18238,7 +18304,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Assinatura Git"
|
||||
"value" : "Assinatura no Git"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -18795,7 +18861,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Visualizar no GitHub"
|
||||
"value" : "Ver no GitHub"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -18980,7 +19046,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ver Documentação na Web"
|
||||
"value" : "Ver documentação na web"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -19223,9 +19289,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Key Properties" : {
|
||||
|
||||
},
|
||||
"no_secure_storage_description" : {
|
||||
"extractionState" : "manual",
|
||||
@@ -19538,7 +19601,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sem Armazenamento Seguro Disponível"
|
||||
"value" : "Sem Armazenamento Seguro disponível"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -19723,7 +19786,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Se você está buscando adicionar um para seu Mac, o YubiKey 5 Series é muito bom."
|
||||
"value" : "Se você procura adicionar um para seu Mac, o YubiKey 5 Series é muito bom."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -19909,7 +19972,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Deixar Destrancado"
|
||||
"value" : "Manter destrancado"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -20095,7 +20158,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Não Destravar"
|
||||
"value" : "Não destrancar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -20162,6 +20225,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Name"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Nome"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -20173,11 +20242,14 @@
|
||||
"state" : "translated",
|
||||
"value" : "Certificate Name"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Restrictions" : {
|
||||
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Nome do Certificado"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"reveal_in_finder_button" : {
|
||||
"extractionState" : "manual",
|
||||
@@ -20372,6 +20444,12 @@
|
||||
"state" : "translated",
|
||||
"value" : "Matching Certificates"
|
||||
}
|
||||
},
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Certificados correspondentes"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -21426,7 +21504,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Renomear"
|
||||
"value" : "Editar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -21975,7 +22053,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Este aplicativo de ajuda é chamado **Secret Agent** e você pode vê-lo no Monitor de Atividades de tempo em tempo."
|
||||
"value" : "Esse aplicativo auxiliar se chama **Secret Agent** e você pode vê-lo no Monitor de Atividades de tempos em tempos."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -22160,7 +22238,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive precisa configurar um aplicativo de ajuda para funcionar corretamente. Isso irá assinar requisições de clientes SSH no plano de fundo para que você não precise manter o aplicativo Secretive aberto."
|
||||
"value" : "O Secretive precisa configurar um aplicativo auxiliar para funcionar corretamente. Ele irá assinar pedidos de clientes SSH em segundo plano, para que você não precise manter o aplicativo principal do Secretive aberto."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -22530,7 +22608,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Configurar Agent"
|
||||
"value" : "Configurar Agente"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -23455,7 +23533,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Secretive irá periodicamente verificar com o GitHub para verificar se existe uma nova versão. Se você ver alguma requisição de rede para o GitHub, este é o porque."
|
||||
"value" : "O Secretive vai verificar o GitHub periodicamente para saber se há uma nova versão. Se notar requisições de rede para o GitHub, esse é o motivo."
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -24382,7 +24460,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Utilizando o segredo %1$(secretName)@"
|
||||
"value" : "Usando o segredo %1$(secretName)@"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -24568,7 +24646,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Requisição Assinada fr %1$(appName)@"
|
||||
"value" : "Assinado pedido de %1$(appName)@"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -24939,7 +25017,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Cartões com chip"
|
||||
"value" : "Smart Card"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -24997,9 +25075,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Specific" : {
|
||||
|
||||
},
|
||||
"unnamed_secret" : {
|
||||
"extractionState" : "manual",
|
||||
@@ -25127,7 +25202,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sem Nome"
|
||||
"value" : "Sem nome"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -25312,7 +25387,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Atualização Crítica de Segurança Requerida"
|
||||
"value" : "Atualização Crítica de Segurança necessária"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -25682,7 +25757,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Atualização Disponível"
|
||||
"value" : "Atualização disponível"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -26426,7 +26501,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Clique para Atualizar"
|
||||
"value" : "Clique para atualizar"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -26797,7 +26872,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Notas de Mudanças"
|
||||
"value" : "Notas de Lançamento"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -26982,7 +27057,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Versão de Teste"
|
||||
"value" : "Build de Teste"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
@@ -27537,7 +27612,7 @@
|
||||
"pt-BR" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Baixar a última Nightly Build"
|
||||
"value" : "Baixar a Nightly Build mais recente"
|
||||
}
|
||||
},
|
||||
"ro" : {
|
||||
|
||||
@@ -36,10 +36,10 @@ import XPCWrappers
|
||||
self.currentVersion = currentVersion
|
||||
_ = Task {
|
||||
if checkOnLaunch {
|
||||
try? await checkForUpdates()
|
||||
try await checkForUpdates()
|
||||
}
|
||||
while !Task.isCancelled {
|
||||
try? await Task.sleep(for: .seconds(Int(checkFrequency)))
|
||||
while true {
|
||||
try await Task.sleep(for: .seconds(Int(checkFrequency)))
|
||||
try await checkForUpdates()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,6 @@ extension SSHAgentInputParser {
|
||||
let signature = try signatureBlob.readNextChunk()
|
||||
let forwarding = try reader.readNextByteAsBool()
|
||||
switch hostKeyType {
|
||||
// FIXME: FACTOR OUT?
|
||||
case "ssh-ed25519":
|
||||
let hostKey = try CryptoKit.Curve25519.Signing.PublicKey(rawRepresentation: hostKeyData)
|
||||
guard hostKey.isValidSignature(signature, for: sessionID) else {
|
||||
@@ -186,7 +185,6 @@ extension SSHAgentInputParser {
|
||||
throw AgentParsingError.unhandledRequest
|
||||
}
|
||||
case "ssh-rsa":
|
||||
// FIXME: HANDLE
|
||||
throw AgentParsingError.unhandledRequest
|
||||
default:
|
||||
throw AgentParsingError.unhandledRequest
|
||||
|
||||
@@ -79,19 +79,23 @@ extension Agent {
|
||||
default:
|
||||
target = nil
|
||||
}
|
||||
_ = target
|
||||
response.append(SSHAgent.Response.agentSignResponse.data)
|
||||
response.append(try await sign(data: context.dataToSign.raw, keyBlob: context.keyBlob, provenance: provenance, target: target))
|
||||
logger.debug("Agent returned \(SSHAgent.Response.agentSignResponse.debugDescription)")
|
||||
case .protocolExtension(.openSSH(.sessionBind(let bind))):
|
||||
// This is disabled until forward enforcement is handled.
|
||||
_ = bind
|
||||
response = try await MainActor.run {
|
||||
guard sessionID == nil else {
|
||||
logger.error("Agent received bind request, but already bound.")
|
||||
// FIXME: This will break forwarding for now.
|
||||
throw BindingFailure()
|
||||
}
|
||||
logger.debug("Agent bound")
|
||||
sessionID = bind
|
||||
return SSHAgent.Response.agentSuccess.data
|
||||
logger.debug("Agent received bind request but not currently supported.")
|
||||
throw UnhandledRequestError()
|
||||
// guard sessionID == nil else {
|
||||
// logger.error("Agent received bind request, but already bound.")
|
||||
// throw BindingFailure()
|
||||
// }
|
||||
// logger.debug("Agent bound")
|
||||
// sessionID = bind
|
||||
// return SSHAgent.Response.agentSuccess.data
|
||||
}
|
||||
logger.debug("Agent returned \(SSHAgent.Response.agentSuccess.debugDescription)")
|
||||
case .unknown(let value):
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension ProcessInfo {
|
||||
private static let fallbackTeamID = "Z72PRUAWF6"
|
||||
|
||||
private static let teamID: String = {
|
||||
#if DEBUG
|
||||
guard let task = SecTaskCreateFromSelf(nil) else {
|
||||
assertionFailure("SecTaskCreateFromSelf failed")
|
||||
return fallbackTeamID
|
||||
}
|
||||
|
||||
guard let value = SecTaskCopyValueForEntitlement(task, "com.apple.developer.team-identifier" as CFString, nil) as? String else {
|
||||
// assertionFailure("SecTaskCopyValueForEntitlement(com.apple.developer.team-identifier) failed")
|
||||
return fallbackTeamID
|
||||
}
|
||||
|
||||
return value
|
||||
#else
|
||||
/// Always use hardcoded team ID for release builds, just in case.
|
||||
return fallbackTeamID
|
||||
#endif
|
||||
}()
|
||||
|
||||
public var teamID: String { Self.teamID }
|
||||
}
|
||||
@@ -12,7 +12,9 @@ public final class XPCServiceDelegate: NSObject, NSXPCListenerDelegate {
|
||||
newConnection.exportedInterface = NSXPCInterface(with: (any _XPCProtocol).self)
|
||||
let exportedObject = exportedObject
|
||||
newConnection.exportedObject = exportedObject
|
||||
newConnection.setCodeSigningRequirement("anchor apple generic and certificate leaf[subject.OU] = \"\(ProcessInfo.processInfo.teamID)\"")
|
||||
#if !DEBUG
|
||||
newConnection.setCodeSigningRequirement("anchor apple generic and certificate leaf[subject.OU] = \"Z72PRUAWF6\"")
|
||||
#endif
|
||||
newConnection.resume()
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -8,7 +8,9 @@ public struct XPCTypedSession<ResponseType: Codable & Sendable, ErrorType: Error
|
||||
public init(serviceName: String, warmup: Bool = false) async throws {
|
||||
let connection = NSXPCConnection(serviceName: serviceName)
|
||||
connection.remoteObjectInterface = NSXPCInterface(with: (any _XPCProtocol).self)
|
||||
connection.setCodeSigningRequirement("anchor apple generic and certificate leaf[subject.OU] = \"\(ProcessInfo.processInfo.teamID)\"")
|
||||
#if !DEBUG
|
||||
connection.setCodeSigningRequirement("anchor apple generic and certificate leaf[subject.OU] = \"Z72PRUAWF6\"")
|
||||
#endif
|
||||
connection.resume()
|
||||
guard let proxy = connection.remoteObjectProxy as? _XPCProtocol else { fatalError() }
|
||||
self.connection = connection
|
||||
|
||||
@@ -13,7 +13,7 @@ import CertificateKit
|
||||
@Test func emptyStores() async throws {
|
||||
let agent = Agent(storeList: SecretStoreList(), certificateStore: CertificateStore())
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestIdentities)
|
||||
let response = await agent.handle(request: request, provenance: .test)
|
||||
let response = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
#expect(response == Constants.Responses.requestIdentitiesEmpty)
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ import CertificateKit
|
||||
let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore())
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestIdentities)
|
||||
let response = await agent.handle(request: request, provenance: .test)
|
||||
let response = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
|
||||
let actual = OpenSSHReader(data: response)
|
||||
let expected = OpenSSHReader(data: Constants.Responses.requestIdentitiesMultiple)
|
||||
@@ -35,7 +35,7 @@ import CertificateKit
|
||||
let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore())
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignatureWithNoneMatching)
|
||||
let response = await agent.handle(request: request, provenance: .test)
|
||||
let response = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
#expect(response == Constants.Responses.requestFailure)
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ import CertificateKit
|
||||
guard case SSHAgent.Request.signRequest(let context) = request else { return }
|
||||
let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore())
|
||||
let response = await agent.handle(request: request, provenance: .test)
|
||||
let response = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
let responseReader = OpenSSHReader(data: response)
|
||||
let length = try responseReader.readNextBytes(as: UInt32.self)
|
||||
let type = try responseReader.readNextBytes(as: UInt8.self)
|
||||
@@ -68,7 +68,7 @@ import CertificateKit
|
||||
let signature = try P256.Signing.ECDSASignature(rawRepresentation: rs)
|
||||
// Correct signature
|
||||
#expect(try P256.Signing.PublicKey(x963Representation: Constants.Secrets.ecdsa256Secret.publicKey)
|
||||
.isValidSignature(signature, for: context.dataToSign))
|
||||
.isValidSignature(signature, for: context.dataToSign.raw))
|
||||
}
|
||||
|
||||
// MARK: Witness protocol
|
||||
@@ -79,7 +79,7 @@ import CertificateKit
|
||||
return true
|
||||
}, witness: { _, _ in })
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore(), witness: witness)
|
||||
let response = await agent.handle(request: .signRequest(.empty), provenance: .test)
|
||||
let response = await agent.handle(request: .signRequest(.empty), provenance: .test, hosts: nil)
|
||||
#expect(response == Constants.Responses.requestFailure)
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ import CertificateKit
|
||||
})
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore(), witness: witness)
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)
|
||||
_ = await agent.handle(request: request, provenance: .test)
|
||||
_ = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
#expect(witnessed)
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ import CertificateKit
|
||||
})
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore(), witness: witness)
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)
|
||||
_ = await agent.handle(request: request, provenance: .test)
|
||||
_ = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
#expect(witnessTrace == speakNowTrace)
|
||||
#expect(witnessTrace == .test)
|
||||
}
|
||||
@@ -122,7 +122,7 @@ import CertificateKit
|
||||
store.shouldThrow = true
|
||||
let agent = Agent(storeList: list, certificateStore: CertificateStore())
|
||||
let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)
|
||||
let response = await agent.handle(request: request, provenance: .test)
|
||||
let response = await agent.handle(request: request, provenance: .test, hosts: nil)
|
||||
#expect(response == Constants.Responses.requestFailure)
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ import CertificateKit
|
||||
|
||||
@Test func unhandledAdd() async throws {
|
||||
let agent = Agent(storeList: SecretStoreList(), certificateStore: CertificateStore())
|
||||
let response = await agent.handle(request: .addIdentity, provenance: .test)
|
||||
let response = await agent.handle(request: .addIdentity, provenance: .test, hosts: nil)
|
||||
#expect(response == Constants.Responses.requestFailure)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,14 +10,14 @@ struct StubWitness {
|
||||
|
||||
extension StubWitness: SigningWitness {
|
||||
|
||||
func speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) throws {
|
||||
func speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance, target: SigningRequestTarget?) throws {
|
||||
let objection = speakNow(secret, provenance)
|
||||
if objection {
|
||||
throw TheresMyChance()
|
||||
}
|
||||
}
|
||||
|
||||
func witness(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) throws {
|
||||
func witness(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance, target: SigningRequestTarget?) throws {
|
||||
witness(secret, provenance)
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import SwiftUI
|
||||
|
||||
extension EnvironmentValues {
|
||||
|
||||
@MainActor fileprivate static let _certificateStore = CertificateStore()
|
||||
@MainActor fileprivate static let _certificateStore: CertificateStore = CertificateStore()
|
||||
|
||||
@MainActor var certificateStore: CertificateStore {
|
||||
EnvironmentValues._certificateStore
|
||||
@@ -49,20 +49,20 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
|
||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||
logger.debug("SecretAgent finished launching")
|
||||
_ = Task {
|
||||
Task {
|
||||
for await session in socketController.sessions {
|
||||
_ = Task {
|
||||
let inputParser = try await XPCAgentInputParser()
|
||||
let hostsReader = try await XPCHostsfileReader()
|
||||
let hosts = try? await hostsReader.read()
|
||||
Task {
|
||||
do {
|
||||
let inputParser = try await XPCAgentInputParser()
|
||||
let hostsReader = try? await XPCHostsfileReader()
|
||||
let hosts = try? await hostsReader?.read()
|
||||
for await message in session.messages {
|
||||
let request = try await inputParser.parse(data: message)
|
||||
let agentResponse = await agent.handle(request: request, provenance: session.provenance, hosts: hosts)
|
||||
try session.write(agentResponse)
|
||||
}
|
||||
} catch {
|
||||
try session.close()
|
||||
try? session.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
<string>1</string>
|
||||
<key>com.apple.security.hardened-process.hardened-heap</key>
|
||||
<true/>
|
||||
<key>com.apple.security.smartcard</key>
|
||||
<true/>
|
||||
<key>com.apple.security.hardened-process.platform-restrictions-string</key>
|
||||
<string>2</string>
|
||||
<key>com.apple.security.smartcard</key>
|
||||
<true/>
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
<string>$(AppIdentifierPrefix)com.maxgoedjen.Secretive</string>
|
||||
|
||||
@@ -8,10 +8,9 @@ final class SecretAgentHostsfileReader: NSObject, XPCProtocol {
|
||||
private let logger = Logger(subsystem: "com.maxgoedjen.secretive.SecretAgentHostsfileReader", category: "SecretAgentHostsfileReader")
|
||||
|
||||
func process(_ data: Data) async throws -> [Data: String] {
|
||||
logger.log("Parser parsed certificate")
|
||||
logger.log("Parsing hostsfile")
|
||||
var result: [Data: String] = [:]
|
||||
// FIXME: THIS
|
||||
for try await line in URL(filePath: "/Users/max/.ssh/known_hosts").lines {
|
||||
for try await line in URL(filePath: NSHomeDirectory().appending("/.ssh/known_hosts")).lines {
|
||||
let split = line.split(separator: " ").map(String.init)
|
||||
guard split.count == 3 else { continue }
|
||||
guard let decoded = Data(base64Encoded: split[2]) else { continue }
|
||||
|
||||
@@ -1710,17 +1710,22 @@
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"SecretAgent/Preview Content\"";
|
||||
ENABLE_APP_SANDBOX = NO;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = NO;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_INCOMING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_POINTER_AUTHENTICATION = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
|
||||
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
|
||||
ENABLE_RESOURCE_ACCESS_USB = NO;
|
||||
INFOPLIST_FILE = SecretAgent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -1736,7 +1741,6 @@
|
||||
RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;
|
||||
SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;
|
||||
};
|
||||
name = Test;
|
||||
};
|
||||
@@ -1751,17 +1755,22 @@
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"SecretAgent/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = "$(SECRETIVE_DEVELOPMENT_TEAM)";
|
||||
ENABLE_APP_SANDBOX = NO;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = NO;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_INCOMING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_POINTER_AUTHENTICATION = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
|
||||
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
|
||||
ENABLE_RESOURCE_ACCESS_USB = NO;
|
||||
INFOPLIST_FILE = SecretAgent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -1777,7 +1786,6 @@
|
||||
RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;
|
||||
SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -1793,17 +1801,22 @@
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"SecretAgent/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = "$(SECRETIVE_DEVELOPMENT_TEAM)";
|
||||
ENABLE_APP_SANDBOX = NO;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = NO;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_INCOMING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;
|
||||
ENABLE_POINTER_AUTHENTICATION = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
|
||||
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
|
||||
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
|
||||
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
|
||||
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
|
||||
ENABLE_RESOURCE_ACCESS_USB = NO;
|
||||
INFOPLIST_FILE = SecretAgent/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -1820,7 +1833,6 @@
|
||||
RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;
|
||||
RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;
|
||||
SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -1835,6 +1847,7 @@
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = "$(SECRETIVE_DEVELOPMENT_TEAM)";
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -1866,6 +1879,7 @@
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -1899,6 +1913,7 @@
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = Z72PRUAWF6;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_ENHANCED_SECURITY = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
<true/>
|
||||
<key>com.apple.security.hardened-process.dyld-ro</key>
|
||||
<true/>
|
||||
<key>com.apple.security.hardened-process.enhanced-security-version</key>
|
||||
<integer>1</integer>
|
||||
<key>com.apple.security.hardened-process.enhanced-security-version-string</key>
|
||||
<string>2</string>
|
||||
<key>com.apple.security.hardened-process.hardened-heap</key>
|
||||
<true/>
|
||||
<key>com.apple.security.hardened-process.platform-restrictions</key>
|
||||
<integer>2</integer>
|
||||
<key>com.apple.security.hardened-process.platform-restrictions-string</key>
|
||||
<string>2</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
Reference in New Issue
Block a user