📄 pgpkeyfilter.c
字号:
PGPError err;
if ( strlen(*query) + growthfactor + 1 > *maxsize )
{
if (growthfactor < 500)
{
growthfactor = 500;
}
err = pgpContextMemRealloc( context, (void **)query,
*maxsize + growthfactor + 1, 0 );
if ( IsPGPError(err) )
{
return err;
}
*maxsize += 500;
}
return kPGPError_NoErr;
}
static PGPError
pgpBuildLDAPQuery(
PGPFilterRef filter,
PGPInt16 filterClass,
PGPBoolean *disableVisited,
char **query,
PGPUInt16 *maxsize )
{
PGPError err = kPGPError_NoErr;
PGPUInt32 numvalue;
PGPBoolean boolvalue;
PGPTime timevalue;
void *strvalue;
PGPSize strsize;
char *newString = NULL;
char buffer[500];
switch (filter->filterType)
{
case kPGPFilterTypeAnd:
{
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, "(&" );
err = pgpBuildLDAPQuery(filter->value.andFilter.andFilter1,
filterClass, disableVisited, query, maxsize );
if (err != kPGPError_NoErr)
{
return err;
}
err = pgpBuildLDAPQuery(filter->value.andFilter.andFilter2,
filterClass, 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 kPGPFilterTypeOr:
{
err = pgpGrowQueryString(filter->context, query, maxsize, 10);
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat(*query, "(|");
err = pgpBuildLDAPQuery(filter->value.orFilter.orFilter1,
filterClass, disableVisited, query, maxsize );
if (err != kPGPError_NoErr)
{
return err;
}
err = pgpBuildLDAPQuery(filter->value.orFilter.orFilter2,
filterClass, 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,
filterClass, 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;
*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:
{
char keyIDBuffer[ 128 ];
*buffer = '\0';
err = PGPGetKeyIDString(
&filter->value.keyKeyID,
kPGPKeyIDString_Full,
keyIDBuffer );
if (IsPGPError(err))
{
return err;
}
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:
{
char keyIDBuffer[ 128 ];
*buffer = '\0';
err = PGPGetKeyIDString(
&filter->value.keySubKeyID,
kPGPKeyIDString_Full,
keyIDBuffer );
if (IsPGPError(err))
{
return err;
}
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 kPGPMatchEqual:
sprintf( buffer,
"(pgpKeyCreateTime=%s)", timeString );
break;
case kPGPMatchGreaterOrEqual:
sprintf( buffer,
"(|(pgpKeyCreateTime>=%s)(pgpKeyCreateTime=%s))",
timeString, timeString);
break;
case kPGPMatchLessOrEqual:
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 kPGPMatchEqual:
sprintf( buffer,
"(pgpKeyExpireTime=%s)", timeString );
break;
case kPGPMatchGreaterOrEqual:
sprintf( buffer,
"(|(pgpKeyExpireTime>=%s)(pgpKeyExpireTime=%s))",
timeString, timeString);
break;
case kPGPMatchLessOrEqual:
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 kPGPMatchEqual:
sprintf( buffer, "(pgpKeySize=%05d)", numvalue );
break;
case kPGPMatchGreaterOrEqual:
sprintf( buffer,
"(|(pgpKeySize>=%05d)(pgpKeySize=%05d))",
numvalue, numvalue );
break;
case kPGPMatchLessOrEqual:
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 == kPGPMatchSubString )
{
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -