📄 keyremove.c
字号:
char* ringfile )
{
PGPContextRef context = mainbPtr->pgpContext;
struct pgpfileBones *filebPtr = mainbPtr->filebPtr;
PGPError err;
PGPFileSpecRef ringFileSpec = NULL;
PGPKeySetRef ringSet = NULL;
PGPKeySetRef keyset = NULL;
PGPKeyListRef keylist = NULL;
PGPKeyIterRef keyiter = NULL;
PGPKeyRef key;
PGPKeyRef sigkey;
PGPUInt32 nkeys = 0;
PGPUInt32 nsigs = 0;
int keeping = 0;
int nremoved = 0;
fprintf( filebPtr->pgpout,
LANG("\nRevoking your signatures from userid '%s' in key ring '%s'\n"),
(mcguffin), ringfile );
/* find mcguffin in specified ring */
err = PGPNewFileSpecFromFullPath( context, ringfile, &ringFileSpec );
pgpAssertNoErr(err);
/* we need this for getting our secret key */
err = pgpOpenKeyringsFromPubringSpec( mainbPtr, ringFileSpec,
&ringSet, kPGPKeyRingOpenFlags_Mutable );
PGPFreeFileSpec(ringFileSpec);
if( IsPGPError(err) ) {
fprintf(filebPtr->pgpout,
LANG("\n\007Can't open keyring '%s'.\n"),ringfile );
return -1;
}
mainbPtr->workingRingSet=ringSet;
/*mainbPtr->workingGroupSet=NULL;*/
err = pgpGetMatchingKeySet(mainbPtr, mcguffin, 0, &keyset );
pgpAssertNoErr(err);
err = PGPCountKeys( keyset, &nkeys );
pgpAssertNoErr(err);
if( nkeys == 0 ) {
fprintf(filebPtr->pgpout,
LANG("\n\007Key not found in key ring '%s'.\n"),
ringfile );
goto done;
}
keeping = 1;
err = PGPCheckKeyRingSigs( keyset, ringSet, 0, NULL, NULL );
err = PGPOrderKeySet( keyset, kPGPAnyOrdering, &keylist );
pgpAssertNoErr(err);
err = PGPNewKeyIter( keylist, &keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterRewind( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNext( keyiter, &key);
pgpAssertNoErr(err);
/* for all keys */
while( key != NULL ) {
PGPUserIDRef userid;
PGPSize actual;
PGPSigRef sig;
char useridstr[ kPGPMaxUserIDSize ];
err = PGPKeyIterRewindUserID( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNextUserID( keyiter, &userid );
pgpAssertNoErr(err);
/* for all userids of key */
while( userid ) {
err = PGPGetUserIDStringBuffer( userid, kPGPUserIDPropName,
kPGPMaxUserIDSize, useridstr, &actual );
pgpAssertNoErr(err);
err = PGPKeyIterRewindUIDSig( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNextUIDSig( keyiter, &sig );
pgpAssertNoErr(err);
/* for all sigs of all userids of all keys */
while( sig != NULL ) {
PGPBoolean propData;
err = PGPGetSigBoolean( sig, kPGPSigPropIsMySig, &propData );
if( propData ) {
nsigs++;
pgpShowKeyBrief( filebPtr, key );
fprintf( filebPtr->pgpout, LANG("\nuser ID: %s\n"),
useridstr );
pgpShowKeySig( filebPtr, ringSet, sig, kShow_Checks );
fprintf(filebPtr->pgpout, LANG(
"Revoke your signature of this user id (y/N)? "));
if (!(keeping = !getyesno(filebPtr,'n',0))) {
char* passphrase;
PGPBoolean mine = 0;
nremoved++;
err = PGPGetSigCertifierKey( sig, ringSet, &sigkey);
pgpAssertNoErr(err);
err = pgpGetValidPassphrase( mainbPtr, sigkey,
&passphrase, &mine );
pgpAssertNoErr(err);
err = PGPRevokeSig( sig, ringSet,
PGPOPassphrase( context, passphrase ),
PGPOLastOption(context) );
pgpAssertNoErr(err);
if(mine) {
PGPFreeData(passphrase);
pgpRemoveFromPointerList( mainbPtr->leaks,
passphrase );
}
break;
}
}
err = PGPKeyIterNextUIDSig( keyiter, &sig );
}
err = PGPKeyIterNextUserID(keyiter,&userid);
}
err = PGPKeyIterNext( keyiter, &key );
}
if( nremoved == 0 )
fprintf(filebPtr->pgpout,LANG("\nNo user id's revoked.\n"));
else {
fprintf(filebPtr->pgpout,LANG("\n%d user id(s) revoked.\n"),
nremoved);
}
/*PGPPropagateTrust( ringSet ); <- not here.*/
if( PGPKeySetNeedsCommit( ringSet ) ) {
err = PGPCommitKeyRingChanges( ringSet );
pgpAssertNoErr(err);
}
done:
if(keyiter)
PGPFreeKeyIter(keyiter);
if(keylist)
PGPFreeKeyList(keylist);
if(keyset)
PGPFreeKeySet(keyset);
if( ringSet ) {
PGPFreeKeySet( ringSet );
mainbPtr->workingRingSet = NULL;
}
return kPGPError_NoErr;
}
PGPError removeSigs(struct pgpmainBones* mainbPtr, char* mcguffin, char*
ringfile, char *origRingFileName )
{
PGPContextRef context = mainbPtr->pgpContext;
struct pgpfileBones *filebPtr = mainbPtr->filebPtr;
PGPBoolean compatible = mainbPtr->envbPtr->compatible;
PGPEnv *env = mainbPtr->envbPtr->m_env;
PGPUInt32 pri;
PGPError err, er2;
PGPFileSpecRef ringFileSpec = NULL;
PGPKeySetRef ringSet = NULL;
PGPKeySetRef keyset = NULL;
PGPKeyListRef keylist = NULL;
PGPKeyIterRef keyiter = NULL;
PGPKeyRef key;
PGPUInt32 nkeys = 0;
PGPUInt32 nsigs = 0;
int keeping = 0;
int nremoved = 0;
fprintf( filebPtr->pgpout,
LANG("\nRemoving signatures from userid '%s' in key ring '%s'\n"),
(mcguffin), ringfile );
/* find mcguffin in specified ring */
err = PGPNewFileSpecFromFullPath( context, ringfile, &ringFileSpec );
pgpAssertNoErr(err);
err = pgpOpenKeyringsFromPubringSpec( mainbPtr,
ringFileSpec, &ringSet, kPGPKeyRingOpenFlags_Mutable);
if( IsPGPError(err) ) {
fprintf(filebPtr->pgpout,
LANG("\nCan't open key ring file '%s'\n"),
ringfile);
goto done;
}
mainbPtr->workingRingSet=ringSet;
/*mainbPtr->workingGroupSet=NULL;*/
err = pgpGetMatchingKeySet(mainbPtr, mcguffin, 0, &keyset );
pgpAssertNoErr(err);
err = PGPCountKeys( keyset, &nkeys );
pgpAssertNoErr(err);
if( nkeys == 0 ) {
fprintf(filebPtr->pgpout,
LANG("\n\007Key not found in key ring '%s'.\n"),
origRingFileName );
goto done;
}
keeping = 1;
err = PGPOrderKeySet( keyset, kPGPAnyOrdering, &keylist );
pgpAssertNoErr(err);
err = PGPNewKeyIter( keylist, &keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterRewind( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNext( keyiter, &key);
pgpAssertNoErr(err);
/* for all keys */
while( key != NULL ) {
PGPUserIDRef userid;
PGPSize actual;
PGPSigRef sig;
char useridstr[ kPGPMaxUserIDSize ];
err = PGPKeyIterRewindUserID( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNextUserID( keyiter, &userid );
pgpAssertNoErr(err);
pgpShowKeyBrief( filebPtr, key );
err = countSigsOnKey( keyiter, &nsigs );
pgpAssertNoErr(err);
if( nsigs == 0 ) {
fprintf(filebPtr->pgpout,
LANG("\nKey has no signatures to remove.\n"));
}
else {
fprintf(filebPtr->pgpout,
LANG("\nKey has %d signatures(s):\n"),nsigs);
}
nsigs=0;
err = PGPKeyIterRewindUserID(keyiter);
pgpAssertNoErr(err);
err = PGPKeyIterNextUserID(keyiter, &userid);
pgpAssertNoErr(err);
/* for all userids of key */
while( userid ) {
err = PGPGetUserIDStringBuffer( userid, kPGPUserIDPropName,
kPGPMaxUserIDSize, useridstr, &actual );
fprintf(filebPtr->pgpout,
LANG("\nSingatures for userid %s:\n"), useridstr);
pgpAssertNoErr(err);
err = PGPKeyIterRewindUIDSig( keyiter );
pgpAssertNoErr(err);
err = PGPKeyIterNextUIDSig( keyiter, &sig );
/*if err, there are none.*/
/* for all sigs of all userids of all keys */
while( sig != NULL ) {
nsigs++;
pgpShowKeySig( filebPtr, ringSet, sig, 0 );
fprintf(filebPtr->pgpout,
LANG("Remove this signature (y/N)? "));
if (!(keeping = !getyesno(filebPtr,'n',0))) {
nremoved++;
PGPRemoveSig( sig );
}
err = PGPKeyIterNextUIDSig( keyiter, &sig );
/*if err, there are no more.*/
}
err = PGPKeyIterNextUserID(keyiter,&userid);
/*if err, there are no more.*/
}
err = PGPKeyIterNext( keyiter, &key );
}
if( err == kPGPError_EndOfIteration )
err = kPGPError_NoErr;
if( nremoved == 0 )
fprintf(filebPtr->pgpout,LANG("\nNo key signatures removed.\n"));
else
fprintf(filebPtr->pgpout,
LANG("\n%d key signatures(s) removed.\n"), nremoved);
if( PGPKeySetNeedsCommit( ringSet ) ) {
err = PGPCommitKeyRingChanges( ringSet );
pgpAssertNoErr(err);
}
done:
if( keyiter)
PGPFreeKeyIter( keyiter );
if( keylist )
PGPFreeKeyList( keylist );
if( keyset )
PGPFreeKeySet( keyset );
if( ringSet )
PGPFreeKeySet( ringSet );
mainbPtr->workingRingSet = NULL;
if( ringFileSpec )
PGPFreeFileSpec( ringFileSpec);
if (!compatible && IsPGPError(err) &&
pgpenvGetInt( env, PGPENV_VERBOSE, &pri, &er2))
pgpShowError( filebPtr, err, __FILE__,__LINE__);
return err;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -