New feature: Ask user which certificate is to be taken when more than one found by the crypto plug-in for a single recipient. - NOTE: This code is not working correctly (yet) so we allways get some *all* keys that are stored by gpg instead of the right key information.
This commit is contained in:
parent
af75bafc1b
commit
ed9f9969e3
@ -1453,6 +1453,14 @@ bool checkMessageSignature( const char* ciphertext,
|
|||||||
bool storeCertificatesFromMessage( const char* ciphertext );
|
bool storeCertificatesFromMessage( const char* ciphertext );
|
||||||
|
|
||||||
|
|
||||||
|
/*! \ingroup groupCryptAct
|
||||||
|
\brief Find all certificate for a given addressee.
|
||||||
|
|
||||||
|
NOTE: The \c certificate parameter must point to an allready allocated
|
||||||
|
block of memory which is large enough to hold the complete list.
|
||||||
|
*/
|
||||||
|
bool findCertificates( const char* addressee, char** certificates );
|
||||||
|
|
||||||
/*! \ingroup groupCryptAct
|
/*! \ingroup groupCryptAct
|
||||||
\brief Encrypts an email message in
|
\brief Encrypts an email message in
|
||||||
\c cleartext according to the \c addressee and
|
\c cleartext according to the \c addressee and
|
||||||
|
@ -1091,8 +1091,8 @@ bool storeCertificatesFromMessage(
|
|||||||
const char* ciphertext ){ return true; }
|
const char* ciphertext ){ return true; }
|
||||||
|
|
||||||
|
|
||||||
/* returns address if address doesn't contain a <xxx> part
|
/* returns address if address doesn't contain a <xxx> part
|
||||||
* else it returns a new string xxx and frees address
|
* else it returns a new string xxx and frees address
|
||||||
*/
|
*/
|
||||||
static char* parseAddress( char* address )
|
static char* parseAddress( char* address )
|
||||||
{
|
{
|
||||||
@ -1138,15 +1138,15 @@ static char* nextAddress( const char** address )
|
|||||||
int found = 0;
|
int found = 0;
|
||||||
if( *address == NULL ) return NULL;
|
if( *address == NULL ) return NULL;
|
||||||
while( **address ) {
|
while( **address ) {
|
||||||
|
|
||||||
switch( **address ) {
|
switch( **address ) {
|
||||||
case '\\': /* escaped character */
|
case '\\': /* escaped character */
|
||||||
++(*address);
|
++(*address);
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
if( comment == 0 ) {
|
if( comment == 0 ) {
|
||||||
if( quote > 0 ) --quote;
|
if( quote > 0 ) --quote;
|
||||||
else ++quote;
|
else ++quote;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '(': /* comment start */
|
case '(': /* comment start */
|
||||||
@ -1154,11 +1154,11 @@ static char* nextAddress( const char** address )
|
|||||||
break;
|
break;
|
||||||
case ')': /* comment end */
|
case ')': /* comment end */
|
||||||
if( quote == 0 ) --comment;
|
if( quote == 0 ) --comment;
|
||||||
break;
|
break;
|
||||||
case '\0':
|
case '\0':
|
||||||
case ',': /* delimiter */
|
case '\1': /* delimiter */
|
||||||
if( quote == 0 && comment == 0 ) {
|
if( quote == 0 && comment == 0 ) {
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1173,14 +1173,53 @@ static char* nextAddress( const char** address )
|
|||||||
result = malloc( len*sizeof(char)+1 );
|
result = malloc( len*sizeof(char)+1 );
|
||||||
strncpy( result, start, len );
|
strncpy( result, start, len );
|
||||||
result[len] = '\0';
|
result[len] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parseAddress(result);
|
return parseAddress(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool encryptMessage( const char* cleartext,
|
/*
|
||||||
|
Find all certificate for a given addressee and return them in a
|
||||||
|
'\1' separated list.
|
||||||
|
NOTE: The certificate parameter must point to an allready allocated
|
||||||
|
block of memory which is large enough to hold the complete list.
|
||||||
|
*/
|
||||||
|
bool findCertificates( const char* addressee, char** certificates )
|
||||||
|
{
|
||||||
|
GpgmeCtx ctx;
|
||||||
|
GpgmeError err;
|
||||||
|
GpgmeKey rKey;
|
||||||
|
const char *s;
|
||||||
|
const char *s2;
|
||||||
|
bool bOk = false;
|
||||||
|
|
||||||
|
gpgme_new (&ctx);
|
||||||
|
gpgme_set_protocol (ctx, GPGMEPLUG_PROTOCOL);
|
||||||
|
|
||||||
|
err = gpgme_op_keylist_start(ctx, addressee, 0);
|
||||||
|
while( GPGME_No_Error == err ) {
|
||||||
|
err = gpgme_op_keylist_next(ctx, &rKey);
|
||||||
|
if( GPGME_No_Error == err ) {
|
||||||
|
bOk = true;
|
||||||
|
s = gpgme_key_get_string_attr (rKey, GPGME_ATTR_USERID, NULL, 0);
|
||||||
|
if( s ) {
|
||||||
|
s2 = gpgme_key_get_string_attr (rKey, GPGME_ATTR_FPR, NULL, 0);
|
||||||
|
if( s2 ) {
|
||||||
|
strcat( *certificates, s );
|
||||||
|
strcat( *certificates, "(" );
|
||||||
|
strcat( *certificates, s2 );
|
||||||
|
strcat( *certificates, ")\1" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gpgme_op_keylist_end( ctx );
|
||||||
|
return bOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool encryptMessage( const char* cleartext,
|
||||||
const char** ciphertext,
|
const char** ciphertext,
|
||||||
const char* addressee,
|
const char* certificate,
|
||||||
struct StructuringInfo* structuring )
|
struct StructuringInfo* structuring )
|
||||||
{
|
{
|
||||||
GpgmeCtx ctx;
|
GpgmeCtx ctx;
|
||||||
@ -1205,7 +1244,7 @@ bool encryptMessage( const char* cleartext,
|
|||||||
|
|
||||||
gpgme_recipients_new (&rset);
|
gpgme_recipients_new (&rset);
|
||||||
|
|
||||||
|
/*
|
||||||
if( GPGMEPLUG_PROTOCOL == GPGME_PROTOCOL_CMS )
|
if( GPGMEPLUG_PROTOCOL == GPGME_PROTOCOL_CMS )
|
||||||
{
|
{
|
||||||
gpgme_recipients_add_name_with_validity (rset,
|
gpgme_recipients_add_name_with_validity (rset,
|
||||||
@ -1214,11 +1253,15 @@ bool encryptMessage( const char* cleartext,
|
|||||||
fputs( "\nGPGSMPLUG encryptMessage() using test key of Aegypten Project\n", stderr );
|
fputs( "\nGPGSMPLUG encryptMessage() using test key of Aegypten Project\n", stderr );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
*/
|
||||||
{
|
{
|
||||||
const char* p = addressee;
|
const char* p = certificate;
|
||||||
char* tok;
|
char* tok;
|
||||||
while( (tok = nextAddress( &p ) ) != 0 ) {
|
while( (tok = nextAddress( &p ) ) != 0 ) {
|
||||||
gpgme_recipients_add_name (rset, tok);
|
if( GPGMEPLUG_PROTOCOL == GPGME_PROTOCOL_CMS )
|
||||||
|
gpgme_recipients_add_name_with_validity (rset, tok, GPGME_VALIDITY_FULL );
|
||||||
|
else
|
||||||
|
gpgme_recipients_add_name (rset, tok);
|
||||||
fprintf( stderr, "\nGPGMEPLUG encryptMessage() using addressee %s\n", tok );
|
fprintf( stderr, "\nGPGMEPLUG encryptMessage() using addressee %s\n", tok );
|
||||||
free(tok);
|
free(tok);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user