25 |
#include <windows.h> |
#include <windows.h> |
26 |
#include <time.h> |
#include <time.h> |
27 |
|
|
28 |
#include "gpgme.h" |
#include "wptGPG.h" |
29 |
#include "wptCard.h" |
#include "wptCard.h" |
30 |
#include "wptCardEdit.h" |
#include "wptCardEdit.h" |
|
#include "wptGPG.h" |
|
31 |
#include "wptErrors.h" |
#include "wptErrors.h" |
32 |
|
#include "wptTypes.h" |
33 |
|
#include "wptW32API.h" |
34 |
|
|
35 |
/* Create a new Smartcard context. */ |
/* Create a new Smartcard context. */ |
36 |
static gpgme_error_t |
static gpgme_error_t |
57 |
|
|
58 |
if (!card) |
if (!card) |
59 |
return; |
return; |
60 |
if (card->aid) |
safe_free (card->aid); |
61 |
free (card->aid); |
safe_free (card->version); |
62 |
if (card->version) |
safe_free (card->lang); |
63 |
free (card->version); |
safe_free (card->login); |
64 |
if (card->lang) |
for (i=0; i < N_CARD_FPR; i++) { |
65 |
free (card->lang); |
safe_free (card->fpr[i]); |
66 |
if (card->login) |
safe_free (card->ca_fpr[i]); |
67 |
free (card->login); |
safe_free (card->fpr_created_str[i]); |
|
for (i=0; i < 3; i++) { |
|
|
if (card->fpr[i]) |
|
|
free (card->fpr[i]); |
|
|
if (card->ca_fpr[i]) |
|
|
free (card->ca_fpr[i]); |
|
|
if (card->fpr_created_str[i]) |
|
|
free (card->fpr_created_str[i]); |
|
68 |
} |
} |
69 |
if (card->surname) |
safe_free (card->surname); |
70 |
free (card->surname); |
safe_free (card->givenname); |
71 |
if (card->givenname) |
safe_free (card->serial); |
72 |
free (card->givenname); |
safe_free (card->vendor); |
73 |
if (card->serial) |
safe_free (card->url); |
74 |
free (card->serial); |
safe_free (card->card_type); |
75 |
if (card->vendor) |
safe_free (card); |
|
free (card->vendor); |
|
|
if (card->url) |
|
|
free (card->url); |
|
|
if (card->card_type) |
|
|
free (card->card_type); |
|
|
free (card); |
|
76 |
|
|
77 |
} |
} |
78 |
|
|
79 |
|
|
80 |
/* Parse the timestamp @long_ts and return a string |
/* Parse the timestamp @long_ts and return a string |
81 |
representation of it (format: YYYY-DD-MM HH:MM:SS). */ |
representation of it (format: depens on locale setting). */ |
82 |
static char* |
static char* |
83 |
get_str_timestamp (long long_ts) |
get_str_timestamp (long long_ts) |
84 |
{ |
{ |
85 |
struct tm *tm; |
char timebuf[64]; |
86 |
char *p, *fmt; |
const char *dat; |
87 |
|
|
88 |
|
if (long_ts < 1) |
89 |
|
return strdup (""); |
90 |
|
dat = get_locale_date (long_ts, timebuf, sizeof (timebuf)-1); |
91 |
|
if (!dat) |
92 |
|
return strdup (""); |
93 |
|
|
94 |
|
return strdup (dat); |
95 |
|
} |
96 |
|
|
97 |
|
|
98 |
|
/* Parse the card version AABB => 0100 */ |
99 |
|
static void |
100 |
|
parse_version (gpg_card_t card, const char *ver) |
101 |
|
{ |
102 |
|
char buf[6]; |
103 |
|
|
104 |
tm = localtime (&long_ts); |
if (strlen (ver) != 4) |
105 |
fmt = "%04d-%02d-%02d %02d:%02d:%02d"; |
return; |
106 |
p = (char*)calloc (1, strlen (fmt)+32); |
buf[0] = *ver++; |
107 |
if (!p) |
buf[1] = *ver++; |
108 |
abort (); |
buf[2] = 0; |
109 |
sprintf (p, fmt, |
buf[3] = *ver++; |
110 |
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, |
buf[4] = *ver++; |
111 |
tm->tm_hour, tm->tm_min, tm->tm_sec); |
buf[5] = 0; |
112 |
return p; |
card->ver[0] = atoi (buf); |
113 |
|
card->ver[1] = atoi (buf+3); |
114 |
} |
} |
115 |
|
|
116 |
|
|
199 |
card->version = strdup (p); |
card->version = strdup (p); |
200 |
if (!card->version) |
if (!card->version) |
201 |
return gpg_error (GPG_ERR_ENOMEM); |
return gpg_error (GPG_ERR_ENOMEM); |
202 |
|
parse_version (card, p); |
203 |
} |
} |
204 |
break; |
break; |
205 |
|
|
283 |
break; |
break; |
284 |
|
|
285 |
case CARD_Fpr: |
case CARD_Fpr: |
286 |
if (field > 4 || field == 1) /* max 3 fprs */ |
if (field > 4 || field == 1) /* max N_CARD_FPR=3 fprs */ |
287 |
break; |
break; |
288 |
card->fpr[field-2] = strdup (p); |
card->fpr[field-2] = strdup (p); |
289 |
if (!card->fpr[field-2]) |
if (!card->fpr[field-2]) |
294 |
if (field > 4 || field == 1) |
if (field > 4 || field == 1) |
295 |
break; |
break; |
296 |
card->fpr_created[field-2] = strtoul (p, NULL, 10); |
card->fpr_created[field-2] = strtoul (p, NULL, 10); |
297 |
card->fpr_created_str[field-2] = get_str_timestamp (strtoul (p, NULL, 10)); |
if (card->fpr_created[field-2] > 0) |
298 |
if (!card->fpr_created_str[field-2]) |
card->fpr_created_str[field-2] = get_str_timestamp (strtoul (p, NULL, 10)); |
299 |
return gpg_error (GPG_ERR_ENOMEM); |
else |
300 |
|
card->fpr_created_str[field-2] = NULL; |
301 |
break; |
break; |
302 |
|
|
303 |
default: |
default: |
304 |
break; |
break; |
305 |
|
|
306 |
} |
} |
307 |
} |
} |
308 |
return 0; |
return 0; |
416 |
|
|
417 |
/* Set the callback to @cb and the hook value to @cb_value. */ |
/* Set the callback to @cb and the hook value to @cb_value. */ |
418 |
void |
void |
419 |
GpgCardEdit::setCallback (const char* (*_cb)(int code, void *opaque), |
GpgCardEdit::setCallback (const char* (*_cb)(int code, void *opaque), |
420 |
void *_cb_value) |
void *_cb_value) |
421 |
{ |
{ |
422 |
this->cb_value = _cb_value; |
this->cb_value = _cb_value; |
636 |
gpgme_error_t |
gpgme_error_t |
637 |
GpgCardEdit::fetchKey (void) |
GpgCardEdit::fetchKey (void) |
638 |
{ |
{ |
639 |
|
gpgme_error_t err = 0; |
640 |
|
|
641 |
if (!this->pin) |
if (!this->pin) |
642 |
return gpg_error (GPG_ERR_INV_OBJ); |
return gpg_error (GPG_ERR_INV_OBJ); |
643 |
|
|
644 |
return 0; |
return err; |
645 |
} |
} |
646 |
|
|
647 |
|
|