📄 pgpkeyfilter.c
字号:
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 kPGPFilterTypeSigKeyID:
{
/*
* This search supports ONLY the LONG 16 char
* keyid search
*/
*buffer = '\0';
err = PGPGetKeyIDString(
&filter->value.sigKeyID,
kPGPKeyIDString_Full,
keyIDBuffer );
if (err != kPGPError_NoErr)
{
return err;
}
buildldap_kPGPFilterTypeSigKeyID:
if ( keyIDBuffer[0] == '0' && tolower(keyIDBuffer[1]) == 'x' ) {
sprintf( buffer, "(pgpSignerID=%s)", &keyIDBuffer[2]);
}
else
{
sprintf( buffer, "(pgpSignerID=%s)", keyIDBuffer);
}
err = pgpGrowQueryString(filter->context,
query, maxsize,
(PGPUInt16) strlen(buffer));
if ( IsPGPError(err) )
{
return kPGPError_OutOfMemory;
}
strcat( *query, buffer );
break;
}
/*
* Generic property searches
*/
case kPGPFilterTypeKeyNumber:
if (filter->value.propnum.prop == kPGPKeyProperty_AlgorithmID)
{
numvalue = filter->value.propnum.val;
goto buildldap_kPGPFilterTypeKeySigAlgorithm;
}
else if (filter->value.propnum.prop == kPGPKeyProperty_Bits)
{
numvalue = filter->value.propnum.val;
goto buildldap_kPGPFilterTypeKeyEncryptKeySize;
}
break;
case kPGPFilterTypeKeyTime:
if (filter->value.proptime.prop == kPGPKeyProperty_Creation)
{
timevalue = filter->value.proptime.val;
goto buildldap_kPGPFilterTypeKeyCreationTime;
}
else if (filter->value.proptime.prop == kPGPKeyProperty_Expiration)
{
timevalue = filter->value.proptime.val;
goto buildldap_kPGPFilterTypeKeyExpirationTime;
}
break;
case kPGPFilterTypeKeyBoolean:
if (filter->value.propbool.prop == kPGPKeyProperty_IsRevoked)
{
boolvalue = filter->value.propbool.val;
goto buildldap_kPGPFilterTypeKeyRevoked;
}
else if (filter->value.propbool.prop == kPGPKeyProperty_IsDisabled)
{
boolvalue = filter->value.propbool.val;
goto buildldap_kPGPFilterTypeKeyDisabled;
}
break;
case kPGPFilterTypeKeyBuffer:
if (filter->value.propbuffer.prop == kPGPKeyProperty_KeyID)
{
err = PGPGetKeyIDString(
filter->value.propbuffer.val,
kPGPKeyIDString_Full,
keyIDBuffer );
if (err != kPGPError_NoErr)
{
return err;
}
goto buildldap_kPGPFilterTypeKeyKeyID;
}
break;
case kPGPFilterTypeSubKeyNumber:
if (filter->value.propnum.prop == kPGPSubKeyProperty_AlgorithmID)
{
/* This is correct for keys that have subkeys */
numvalue = filter->value.propnum.val;
goto buildldap_kPGPFilterTypeKeyEncryptAlgorithm;
}
break;
case kPGPFilterTypeSubKeyBuffer:
if (filter->value.propbuffer.prop == kPGPSubKeyProperty_KeyID)
{
err = PGPGetKeyIDString(
filter->value.propbuffer.val,
kPGPKeyIDString_Full,
keyIDBuffer );
if (err != kPGPError_NoErr)
{
return err;
}
goto buildldap_kPGPFilterTypeSubKeyID;
}
break;
case kPGPFilterTypeUserIDBuffer:
if (filter->value.propbuffer.prop == kPGPUserIDProperty_Name)
{
strvalue = filter->value.propbuffer.val;
strsize = filter->value.propbuffer.len;
goto buildldap_kPGPFilterTypeUserIDString;
}
else if (filter->value.propbuffer.prop ==
kPGPUserIDProperty_EmailAddress)
{
strvalue = filter->value.propbuffer.val;
strsize = filter->value.propbuffer.len;
goto buildldap_kPGPFilterTypeUserIDEmail;
}
break;
case kPGPFilterTypeSigBuffer:
if (filter->value.propbuffer.prop == kPGPSigProperty_KeyID)
{
err = PGPGetKeyIDString(
filter->value.propbuffer.val,
kPGPKeyIDString_Full,
keyIDBuffer );
if (err != kPGPError_NoErr)
{
return err;
}
goto buildldap_kPGPFilterTypeSigKeyID;
}
break;
/*
* Searches which are not supported by LDAP
*/
case kPGPFilterTypeKeyFingerPrint:
case kPGPFilterTypeKeySigKeySize:
{
return kPGPError_UnsupportedLDAPFilter;
}
default:
{
return kPGPError_UnknownFilterType;
}
}
return(0);
}
static PGPError
pgpBuildLDAPX509Query(
PGPFilterRef filter,
char **query,
PGPUInt16 *maxsize )
{
PGPError err = kPGPError_NoErr;
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 = pgpBuildLDAPX509Query(filter->value.andFilter.andFilter1,
query, maxsize );
if (err != kPGPError_NoErr)
return err;
err = pgpBuildLDAPX509Query(filter->value.andFilter.andFilter2,
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 = pgpBuildLDAPX509Query(filter->value.orFilter.orFilter1,
query, maxsize );
if (err != kPGPError_NoErr)
return err;
err = pgpBuildLDAPX509Query(filter->value.orFilter.orFilter2,
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 = pgpBuildLDAPX509Query(filter->value.notFilter,
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 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, "(cn=*)" );
else if( ( strlen( newString ) == 1 ) && ( newString[0] == '*' ) )
sprintf( buffer, "(cn=*)" );
else
sprintf( buffer, "(cn=*%s*)", newString );
}
else
sprintf( buffer, "(cn=%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, "(cn=%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 );
err = pgpEncodeSearchTerms( filter->context,
strvalue, strsize, &newString);
if ( IsPGPError(err) )
return kPGPError_OutOfMemory;
if ( filter->match == kPGPMatchCriterion_SubString )
sprintf( buffer, "(mail=*%s*)", newString );
else
{
/*
* assume EXACT email address matching
*/
sprintf( buffer, "(mail=%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;
}
/*
* Generic property searches
*/
case kPGPFilterTypeUserIDBuffer:
if (filter->value.propbuffer.prop == kPGPUserIDProperty_Name)
{
strvalue = filter->value.propbuffer.val;
strsize = filter->value.propbuffer.len;
goto buildldap_kPGPFilterTypeUserIDString;
}
break;
/*
* Searches which are not supported by LDAP
*/
case kPGPFilterTypeSigKeyID:
case kPGPFilterTypeKeyNumber:
case kPGPFilterTypeKeyTime:
case kPGPFilterTypeKeyBoolean:
case kPGPFilterTypeKeyEncryptAlgorithm:
case kPGPFilterTypeKeySigAlgorithm:
case kPGPFilterTypeKeyKeyID:
case kPGPFilterTypeKeyBuffer:
case kPGPFilterTypeKeySubKeyID:
case kPGPFilterTypeKeyCreationTime:
case kPGPFilterTypeKeyExpirationTime:
case kPGPFilterTypeKeyRevoked:
case kPGPFilterTypeKeyDisabled:
case kPGPFilterTypeKeyEncryptKeySize:
case kPGPFilterTypeKeyFingerPrint:
case kPGPFilterTypeKeySigKeySize:
{
return kPGPError_UnsupportedLDAPFilter;
}
default:
{
return kPGPError_UnknownFilterType;
}
}
return(0);
}
PGPError
PGPLDAPQueryFromFilter(
PGPFilterRef filter,
char **queryOut )
{
PGPUInt16 maxsize = 1000;
PGPUInt16 bufLength = 0;
PGPError err = kPGPError_NoErr;
PGPBoolean disableVisited = FALSE;
char *querybuf;
PGPValidatePtr( queryOut );
*queryOut = NULL;
PGPValidateFilter( filter );
pgpEnterPGPErrorFunction();
querybuf = (char*) pgpContextMemAlloc( filter->context,
maxsize, kPGPMemoryMgrFlags_Clear );
if (querybuf == NULL)
{
return kPGPError_OutOfMemory;
}
*querybuf = '\0';
err = pgpBuildLDAPQuery(filter,
&disableVisited, &querybuf, &maxsize);
if ( IsntPGPError(err) )
{
/*
* allocate a buffer big enough to hold the query and potentially
* the extra pgpDisabled condition that is added at the end
*/
bufLength = strlen(querybuf);
*queryOut = (char *)PGPNewData(
PGPPeekContextMemoryMgr( filter->context ),
bufLength + 41, 0);
if ( *queryOut != NULL )
{
if (disableVisited == FALSE)
{
sprintf(*queryOut, "(&%s(pgpDisabled=0))", querybuf );
}
else
{
pgpCopyMemory( querybuf, *queryOut, bufLength);
(*queryOut)[bufLength] = '\0';
}
}
else
{
*queryOut = NULL;
err = kPGPError_OutOfMemory;
}
}
else
{
*queryOut = NULL;
}
pgpContextMemFree( filter->context, querybuf );
pgpAssertErrWithPtr( err, *queryOut );
return err;
}
PGPError
PGPLDAPX509QueryFromFilter(
PGPFilterRef filter,
char **queryOut )
{
PGPUInt16 maxsize = 1000;
PGPUInt16 bufLength = 0;
PGPError err = kPGPError_NoErr;
char *querybuf;
PGPValidatePtr( queryOut );
*queryOut = NULL;
PGPValidateFilter( filter );
pgpEnterPGPErrorFunction();
querybuf = (char*) pgpContextMemAlloc( filter->context,
maxsize, kPGPMemoryMgrFlags_Clear );
if (querybuf == NULL)
{
return kPGPError_OutOfMemory;
}
*querybuf = '\0';
err = pgpBuildLDAPX509Query(filter,
&querybuf, &maxsize);
if ( IsntPGPError(err) )
{
bufLength = strlen(querybuf);
/*
* I'd love to tell you what the "+ 41" in the PGPNewData call means
* but I really have no idea. It was there when I copied
* PGPLD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -