⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgpkeyfilter.c

📁 可以实现对邮件的加密解密以及签名
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -