📄 pgpkeyfilter.c
字号:
return kPGPError_OutOfMemory;
}
strcat( *query, ")" );
break;
}
case kPGPFilterTypeOr:
{
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat(*query, "(|");
err = pgpBuildLDAPQuery(filter->value.orFilter.orFilter1,
disableVisited, query, maxsize );
if (err != kPGPError_NoErr)
{
return err;
}
err = pgpBuildLDAPQuery(filter->value.orFilter.orFilter2,
disableVisited, query, maxsize );
if (err != kPGPError_NoErr)
{
return err;
}
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, ")");
break;
}
case kPGPFilterTypeNot:
{
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, "(!" );
err = pgpBuildLDAPQuery(filter->value.notFilter,
disableVisited, query, maxsize );
if (err != kPGPError_NoErr)
{
return err;
}
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, ")");
break;
}
case kPGPFilterTypeKeyEncryptAlgorithm:
{
numvalue = filter->value.keyEncryptAlgorithm;
buildldap_kPGPFilterTypeKeyEncryptAlgorithm:
*buffer = '\0';
switch ( numvalue )
{
case kPGPPublicKeyAlgorithm_RSA:
case kPGPPublicKeyAlgorithm_RSAEncryptOnly:
case kPGPPublicKeyAlgorithm_RSASignOnly:
{
strcpy( buffer, "(pgpKeyType=RSA)");
break;
}
case kPGPPublicKeyAlgorithm_ElGamal:
case kPGPPublicKeyAlgorithm_DSA:
{
strcpy( buffer, "(pgpKeyType=DSS/DH)");
break;
}
default:
return kPGPError_InvalidFilterParameter;
}
err = pgpGrowQueryString(filter->context,
query, maxsize, (PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeySigAlgorithm:
{
numvalue = filter->value.keySigAlgorithm;
buildldap_kPGPFilterTypeKeySigAlgorithm:
*buffer = '\0';
switch ( numvalue )
{
case kPGPPublicKeyAlgorithm_RSA:
case kPGPPublicKeyAlgorithm_RSAEncryptOnly:
case kPGPPublicKeyAlgorithm_RSASignOnly:
{
strcpy( buffer, "(pgpKeyType=RSA)");
break;
}
case kPGPPublicKeyAlgorithm_ElGamal:
case kPGPPublicKeyAlgorithm_DSA:
{
strcpy( buffer, "(pgpKeyType=DSS/DH)");
break;
}
default:
return kPGPError_InvalidFilterParameter;
}
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeyKeyID:
{
*buffer = '\0';
err = PGPGetKeyIDString(
&filter->value.keyKeyID,
kPGPKeyIDString_Full,
keyIDBuffer );
if (IsPGPError(err))
{
return err;
}
buildldap_kPGPFilterTypeKeyKeyID:
if ( keyIDBuffer[0] == '0' && tolower(keyIDBuffer[1]) == 'x' ) {
if (strlen(keyIDBuffer) == 10) {
sprintf( buffer, "(pgpKeyID=%s)", &keyIDBuffer[2]);
}
else
{
sprintf( buffer, "(pgpCertID=%s)", &keyIDBuffer[2]);
}
}
else
{
if (strlen(keyIDBuffer) == 8) {
sprintf( buffer, "(pgpKeyID=%s)", keyIDBuffer);
}
else
{
sprintf( buffer, "(pgpCertID=%s)", keyIDBuffer);
}
}
err = pgpGrowQueryString(filter->context,
query, maxsize, (PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeySubKeyID:
{
*buffer = '\0';
err = PGPGetKeyIDString(
&filter->value.keySubKeyID,
kPGPKeyIDString_Full,
keyIDBuffer );
if (IsPGPError(err))
{
return err;
}
buildldap_kPGPFilterTypeSubKeyID:
if ( keyIDBuffer[0] == '0' && tolower(keyIDBuffer[1]) == 'x' ) {
sprintf( buffer, "(pgpSubKeyID=%s)", &keyIDBuffer[2]);
}
else
{
sprintf( buffer, "(pgpSubKeyID=%s)", keyIDBuffer);
}
err = pgpGrowQueryString(filter->context,
query, maxsize, (PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeyCreationTime:
{
/*
* format: YYYYMMDDHHMMSSZ
*/
timevalue = filter->value.keyCreationTime;
buildldap_kPGPFilterTypeKeyCreationTime:
*buffer = '\0';
if (timevalue != 0)
{
struct tm *localTime;
char timeString[20];
localTime = pgpLocalTime(&timevalue);
if ( localTime == NULL )
{
return kPGPError_OutOfMemory;
}
sprintf( timeString, "%4d%02d%02d%02d%02d%02dZ",
1900+localTime->tm_year, localTime->tm_mon+1,
localTime->tm_mday, localTime->tm_hour,
localTime->tm_min, localTime->tm_sec );
switch ( filter->match )
{
case kPGPMatchCriterion_Equal:
sprintf( buffer,
"(pgpKeyCreateTime=%s)", timeString );
break;
case kPGPMatchCriterion_GreaterOrEqual:
sprintf( buffer,
"(|(pgpKeyCreateTime>=%s)(pgpKeyCreateTime=%s))",
timeString, timeString);
break;
case kPGPMatchCriterion_LessOrEqual:
sprintf( buffer,
"(|(pgpKeyCreateTime<=%s)(pgpKeyCreateTime=%s))",
timeString, timeString);
break;
default:
return kPGPError_InvalidFilterParameter;
}
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeyExpirationTime:
{
/*
* format: YYYYMMDDHHMMSSZ
*/
timevalue = filter->value.keyExpirationTime;
buildldap_kPGPFilterTypeKeyExpirationTime:
*buffer = '\0';
if (timevalue != 0)
{
struct tm *localTime;
char timeString[20];
localTime = pgpLocalTime(&timevalue);
if ( localTime == NULL )
{
return kPGPError_OutOfMemory;
}
sprintf( timeString, "%4d%02d%02d%02d%02d%02dZ",
1900+localTime->tm_year, localTime->tm_mon+1,
localTime->tm_mday, localTime->tm_hour,
localTime->tm_min, localTime->tm_sec );
switch ( filter->match )
{
case kPGPMatchCriterion_Equal:
sprintf( buffer,
"(pgpKeyExpireTime=%s)", timeString );
break;
case kPGPMatchCriterion_GreaterOrEqual:
sprintf( buffer,
"(|(pgpKeyExpireTime>=%s)(pgpKeyExpireTime=%s))",
timeString, timeString);
break;
case kPGPMatchCriterion_LessOrEqual:
sprintf( buffer,
"(|(pgpKeyExpireTime<=%s)(pgpKeyExpireTime=%s))",
timeString, timeString );
break;
default:
return kPGPError_InvalidFilterParameter;
}
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeyRevoked:
{
boolvalue = filter->value.keyRevoked;
buildldap_kPGPFilterTypeKeyRevoked:
sprintf( buffer, "(pgpRevoked=%d)", boolvalue);
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeKeyDisabled:
{
boolvalue = filter->value.keyDisabled;
buildldap_kPGPFilterTypeKeyDisabled:
sprintf( buffer, "(pgpDisabled=%d)", boolvalue);
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
*disableVisited = TRUE;
break;
}
case kPGPFilterTypeKeyEncryptKeySize:
{
numvalue = filter->value.keyEncryptKeySize;
buildldap_kPGPFilterTypeKeyEncryptKeySize:
switch ( filter->match )
{
case kPGPMatchCriterion_Equal:
sprintf( buffer, "(pgpKeySize=%05d)", numvalue );
break;
case kPGPMatchCriterion_GreaterOrEqual:
sprintf( buffer,
"(|(pgpKeySize>=%05d)(pgpKeySize=%05d))",
numvalue, numvalue );
break;
case kPGPMatchCriterion_LessOrEqual:
sprintf( buffer,
"(|(pgpKeySize<=%05d)(pgpKeySize=%05d))",
numvalue, numvalue );
break;
default:
return kPGPError_InvalidFilterParameter;
}
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeUserIDString:
{
strvalue = filter->value.userIDString;
strsize = strlen( strvalue );
buildldap_kPGPFilterTypeUserIDString:
err = pgpEncodeSearchTerms( filter->context,
strvalue, strsize, &newString );
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
if ( filter->match == kPGPMatchCriterion_SubString )
{
/* A few special cases before the more general case */
if( strlen( newString ) == 0 )
sprintf( buffer, "(pgpUserID=*)" );
else if( ( strlen( newString ) == 1 ) && ( newString[0] == '*' ) )
sprintf( buffer, "(pgpUserID=*)" );
else
sprintf( buffer, "(pgpUserID=*%s*)", newString );
}
else
{
sprintf( buffer, "(pgpUserID=%s)", newString );
}
pgpContextMemFree( filter->context, newString);
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeUserIDName:
{
strvalue = filter->value.userIDName;
strsize = strlen( strvalue );
err = pgpEncodeSearchTerms( filter->context,
strvalue, strsize, &newString );
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
sprintf( buffer, "(pgpUserID=%s)", newString );
pgpContextMemFree( filter->context, newString);
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
case kPGPFilterTypeUserIDEmail:
{
strvalue = filter->value.userIDEmail;
strsize = strlen( strvalue );
buildldap_kPGPFilterTypeUserIDEmail:
err = pgpEncodeSearchTerms( filter->context,
strvalue, strsize, &newString);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
if ( filter->match == kPGPMatchCriterion_SubString )
{
sprintf( buffer, "(pgpUserID=*<*%s*>*)", newString );
}
else
{
/*
* assume EXACT email address matching
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -