aboutsummaryrefslogtreecommitdiffstats
path: root/gpgmeplug/gpgmeplug.c
diff options
context:
space:
mode:
authorSteffen Hansen <[email protected]>2002-06-10 11:24:39 +0000
committerSteffen Hansen <[email protected]>2002-06-10 11:24:39 +0000
commit7b8ab474d31273d0542a5fabe6031a0936f67920 (patch)
tree89097e7815f2958fa5e8e2e87a12b925dab730f4 /gpgmeplug/gpgmeplug.c
parent* gpgsm/t-encrypt.c (main): Add a simple option parser and allow (diff)
downloadgpgme-7b8ab474d31273d0542a5fabe6031a0936f67920.tar.gz
gpgme-7b8ab474d31273d0542a5fabe6031a0936f67920.zip
more cert. info features
Diffstat (limited to '')
-rw-r--r--gpgmeplug/gpgmeplug.c90
1 files changed, 82 insertions, 8 deletions
diff --git a/gpgmeplug/gpgmeplug.c b/gpgmeplug/gpgmeplug.c
index ffc86c9b..bfc7695b 100644
--- a/gpgmeplug/gpgmeplug.c
+++ b/gpgmeplug/gpgmeplug.c
@@ -1762,6 +1762,9 @@ void updateCRL(){}
* Boston, MA 02111, USA.
*/
+/* Max number of parts in a DN */
+#define MAX_GPGME_IDX 20
+
/* some macros to replace ctype ones and avoid locale problems */
#define spacep(p) (*(p) == ' ' || *(p) == '\t')
#define digitp(p) (*(p) >= '0' && *(p) <= '9')
@@ -1777,6 +1780,7 @@ void updateCRL(){}
#define xtoi_2(p) ((xtoi_1(p) * 16) + xtoi_1((p)+1))
#define safe_malloc( x ) malloc( x )
+#define xstrdup( x ) (x)?strdup(x):0
static void safe_free( void** x )
{
@@ -1933,14 +1937,67 @@ parse_dn (const unsigned char *string)
return NULL;
}
+static int add_dn_part( char* result, struct DnPair* dn, const char* part )
+{
+ int any = 0;
+ for(; dn->key; ++dn ) {
+ if( !strcmp( dn->key, part ) ) {
+ if( any ) strcat( result, "+" );
+ strcat( result, dn->value );
+ any = 1;
+ }
+ }
+ return any;
+}
+
+static char* reorder_dn( struct DnPair *dn )
+{
+ const char* stdpart[] = {
+ "CN", "OU", "O", "STREET", "L", "ST", "C", NULL
+ };
+ int any=0, any2=0, len=0, i;
+ char* result;
+ for( i = 0; dn[i].key; ++i ) {
+ len += strlen( dn[i].key );
+ len += strlen( dn[i].value );
+ len += 4; /* ',' and '=', and possibly "(" and ")" */
+ }
+ result = (char*)safe_malloc( (len+1)*sizeof(char) );
+ *result = 0;
+
+ /* add standard parts */
+ for( i = 0; stdpart[i]; ++i ) {
+ if( any ) {
+ strcat( result, "," );
+ }
+ any = add_dn_part( result, dn, stdpart[i] );
+ }
+
+ /* add remaining parts in no particular order */
+ for(; dn->key; ++dn ) {
+ for( i = 0; stdpart[i]; ++i ) {
+ if( !strcmp( dn->key, stdpart[i] ) ) {
+ break;
+ }
+ }
+ if( !stdpart[i] ) {
+ if( any ) strcat( result, "," );
+ if( !any2 ) strcat( result, "(");
+ any = add_dn_part( result, dn, dn->key );
+ any2 = 1;
+ }
+ }
+ if( any2 ) strcat( result, ")");
+ return result;
+}
struct CertIterator {
GpgmeCtx ctx;
struct CertificateInfo info;
};
-struct CertIterator* startListCertificates( void )
+struct CertIterator* startListCertificates( const char* pattern )
{
GpgmeError err;
struct CertIterator* it;
@@ -1956,7 +2013,7 @@ struct CertIterator* startListCertificates( void )
}
gpgme_set_protocol (it->ctx, GPGME_PROTOCOL_CMS);
- err = gpgme_op_keylist_start ( it->ctx, NULL, 0);
+ err = gpgme_op_keylist_start ( it->ctx, pattern, 0);
if( err != GPGME_No_Error ) {
endListCertificates( it );
return NULL;
@@ -1965,8 +2022,6 @@ struct CertIterator* startListCertificates( void )
return it;
}
-#define MAX_GPGME_IDX 20
-
static void freeStringArray( char** c )
{
char** _c = c;
@@ -1997,7 +2052,21 @@ static void freeInfo( struct CertificateInfo* info )
memset( info, 0, sizeof( *info ) );
}
-#define xstrdup( x ) (x)?strdup(x):0
+static char* make_fingerprint( const char* fpr )
+{
+ int len = strlen(fpr);
+ int i = 0;
+ char* result = safe_malloc( (len + len/2 + 1)*sizeof(char) );
+ if( !result ) return NULL;
+ for(; *fpr; ++fpr, ++i ) {
+ if( i%3 == 2) {
+ result[i] = ':'; ++i;
+ }
+ result[i] = *fpr;
+ }
+ result[i] = 0;
+ return result;
+}
struct CertificateInfo* nextCertificate( struct CertIterator* it )
{
@@ -2023,8 +2092,13 @@ struct CertificateInfo* nextCertificate( struct CertIterator* it )
it->info.dnarray = 0;
for( idx = 0; names[idx] != 0; ++idx ) {
struct DnPair* a = parse_dn( names[idx] );
- it->info.userid[idx] = names[idx];
- it->info.dnarray = a;
+ if( idx == 0 ) {
+ it->info.userid[idx] = reorder_dn( a );
+ safe_free( &(names[idx]) );
+ } else {
+ it->info.userid[idx] = names[idx];
+ it->info.dnarray = a;
+ }
}
it->info.userid[idx] = 0;
@@ -2032,7 +2106,7 @@ struct CertificateInfo* nextCertificate( struct CertIterator* it )
it->info.serial = xstrdup(s);
s = gpgme_key_get_string_attr (key, GPGME_ATTR_FPR, 0, 0);
- it->info.fingerprint = xstrdup(s);
+ it->info.fingerprint = make_fingerprint( s );
s = gpgme_key_get_string_attr (key, GPGME_ATTR_ISSUER, 0, 0);
it->info.issuer = xstrdup(s);