add repo key permanently after asking for confirmation

This commit is contained in:
oliverkurth 2020-08-27 20:14:06 -07:00
parent da4d89bf2a
commit b0d7c3e30e
5 changed files with 96 additions and 20 deletions

View File

@ -264,7 +264,6 @@ AddKeyToKeyRing(
}
BAIL_ON_TDNF_ERROR(dwError);
}
cleanup:
TDNF_SAFE_FREE_MEMORY(pszKeyData);
return dwError;
@ -376,3 +375,36 @@ error:
}
goto cleanup;
}
uint32_t
TDNFImportGPGKey(
rpmts pTS,
const char* pszFile
)
{
uint32_t dwError = 0;
pgpArmor nArmor = PGPARMOR_NONE;
uint8_t* pPkt = NULL;
size_t nPktLen = 0;
char* pszKeyData = NULL;
dwError = ReadGPGKey(pszFile, &pszKeyData);
BAIL_ON_TDNF_ERROR(dwError);
nArmor = pgpParsePkts(pszKeyData, &pPkt, &nPktLen);
if(nArmor != PGPARMOR_PUBKEY)
{
dwError = ERROR_TDNF_INVALID_PUBKEY_FILE;
BAIL_ON_TDNF_ERROR(dwError);
}
dwError = rpmtsImportPubkey(pTS, pPkt, nPktLen);
BAIL_ON_TDNF_ERROR(dwError);
cleanup:
TDNF_SAFE_FREE_MEMORY(pszKeyData);
return dwError;
error:
goto cleanup;
}

View File

@ -72,6 +72,12 @@ TDNFGPGCheck(
const char* pszPackage
);
uint32_t
TDNFImportGPGKey(
rpmts pTS,
const char* pszFile
);
//init.c
uint32_t
TDNFCloneCmdArgs(
@ -897,6 +903,13 @@ TDNFGetCmdOpt(
PTDNF_CMD_OPT *ppOpt
);
uint32_t
TDNFYesOrNo(
PTDNF_CMD_ARGS pArgs,
const char *pszQuestion,
int *pAnswer
);
//validate.c
uint32_t
TDNFValidateCmdArgs(

View File

@ -390,9 +390,8 @@ TDNFTransAddInstallPkg(
char* pszDownloadCacheDir = NULL;
char* pszUrlGPGKey = NULL;
PTDNF_CACHED_RPM_ENTRY pRpmCache = NULL;
rpmKeyring pSavedKeyring = NULL;
int nRestoreKey = 0;
rpmKeyring pKeyring = NULL;
int nAnswer = 0;
dwError = TDNFAllocateStringPrintf(
&pszRpmCacheDir,
@ -474,22 +473,19 @@ TDNFTransAddInstallPkg(
{
dwError = TDNFGetGPGSignatureCheck(pTdnf, pszRepoName, &nGPGSigCheck, &pszUrlGPGKey);
BAIL_ON_TDNF_ERROR(dwError);
if(nGPGSigCheck)
{
pKeyring = rpmKeyringNew();
if(!pKeyring)
{
dwError = ERROR_TDNF_RPMTS_KEYRING_FAILED;
BAIL_ON_TDNF_ERROR(dwError);
}
dwError = TDNFGPGCheck(pKeyring, pszUrlGPGKey, pszFilePath);
printf("importing key from %s\n", pszUrlGPGKey);
dwError = TDNFYesOrNo(pTdnf->pArgs, "Is this ok [y/N]: ", &nAnswer);
BAIL_ON_TDNF_ERROR(dwError);
if(nAnswer)
{
pKeyring = rpmtsGetKeyring(pTS->pTS, 0);
dwError = TDNFImportGPGKey(pTS->pTS, pszUrlGPGKey);
BAIL_ON_TDNF_ERROR(dwError);
pSavedKeyring = rpmtsGetKeyring(pTS->pTS, 0);
nRestoreKey = 1;
dwError = rpmtsSetKeyring (pTS->pTS, pKeyring);
dwError = TDNFGPGCheck(pKeyring, pszUrlGPGKey, pszFilePath);
BAIL_ON_TDNF_ERROR(dwError);
fp = Fopen (pszFilePath, "r.ufdio");
@ -509,7 +505,10 @@ TDNFTransAddInstallPkg(
Fclose(fp);
fp = NULL;
}
} else {
dwError = ERROR_TDNF_OPERATION_ABORTED;
BAIL_ON_TDNF_ERROR(dwError);
}
} else if (!nGPGSigCheck && (dwError == RPMRC_NOTTRUSTED || dwError == RPMRC_NOKEY)) {
dwError = 0;
}
@ -543,9 +542,6 @@ TDNFTransAddInstallPkg(
pTS->pCachedRpmsArray->pHead = pRpmCache;
}
cleanup:
if (nRestoreKey) {
rpmtsSetKeyring (pTS->pTS, pSavedKeyring);
}
if(pKeyring)
{
rpmKeyringFree(pKeyring);

View File

@ -649,3 +649,36 @@ TDNFGetCmdOpt(
error:
return dwError;
}
uint32_t
TDNFYesOrNo(
PTDNF_CMD_ARGS pArgs,
const char *pszQuestion,
int *pAnswer
)
{
uint32_t dwError = 0;
int nAnswer = 0;
int32_t opt = 0;
if(!pArgs->nAssumeYes && !pArgs->nAssumeNo)
{
printf("%s ", pszQuestion);
while ((getchar()) != '\n');
opt = getchar();
if (tolower(opt) != 'y' && tolower(opt) != 'n')
{
printf("Invalid input\n");
dwError = ERROR_TDNF_INVALID_INPUT;
BAIL_ON_TDNF_ERROR(dwError);
}
}
if(pArgs->nAssumeYes || (tolower(opt) == 'y'))
{
nAnswer = 1;
}
*pAnswer = nAnswer;
error:
return dwError;
}

View File

@ -65,6 +65,8 @@ extern "C" {
#define ERROR_TDNF_ERASE_NEEDS_INSTALL 1031
#define ERROR_TDNF_OPERATION_ABORTED 1032
#define ERROR_TDNF_INVALID_INPUT 1033
//curl errors
#define ERROR_TDNF_CURL_INIT 1200
#define ERROR_TDNF_CURL_BASE 1201