Renamed to olgpgmain and olgpgcore. Added fucntion to retrieve the
[gpgol.git] / src / verify-dialog.c
1 /* verify-dialog.c
2  *      Copyright (C) 2005 g10 Code GmbH
3  *
4  * This file is part of OutlGPG.
5  *
6  * OutlGPG is Free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public License
8  * as published by the Free Software Foundation; either version 2.1 
9  * of the License, or (at your option) any later version.
10  *  
11  * OutlGPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GPGME Dialogs; if not, write to the Free Software Foundation, 
18  * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
19  */
20
21 #include <windows.h>
22 #include <time.h>
23
24 #include "olgpgcoredlgs.h"
25 #include "gpgme.h"
26 #include "keycache.h"
27 #include "intern.h"
28
29 static char*
30 get_timestamp (time_t l)
31 {
32     static char buf[64];
33     struct tm * tm;
34
35     if (l == 0) {
36         sprintf (buf, "????" "-??" "-?? ??" ":??" ":??");
37         return buf;
38     }
39         
40     tm = localtime (&l);
41     sprintf (buf, "%04d-%02d-%02d %02d:%02d:%02d",
42              tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
43              tm->tm_hour, tm->tm_min, tm->tm_sec);
44     return buf;
45 }
46
47
48 static int
49 load_akalist (HWND dlg, gpgme_key_t key)
50 {
51     gpgme_user_id_t u;
52     int n = 0;
53
54     u = key->uids;
55     if (!u->next)
56         return n;
57     for (u=u->next; u; u=u->next) {
58         SendDlgItemMessage (dlg, IDC_VRY_AKALIST, LB_ADDSTRING,
59                             0, (LPARAM)(const char*)u->uid);
60         n++;
61     }
62     return n;
63 }
64
65
66 static void 
67 load_sigbox (HWND dlg, gpgme_verify_result_t ctx)
68 {
69     gpgme_key_t key;
70     char *s, buf[2+16+1];
71     char *p;
72     int stat;
73     int valid, no_key = 0, n = 0;
74
75     s = get_timestamp (ctx->signatures->timestamp);
76     SetDlgItemText (dlg, IDC_VRY_TIME, s);
77
78     s = ctx->signatures->fpr;
79     if (strlen (s) == 40)
80         strncpy (buf+2, s+40-8, 8);
81     else if (strlen (s) == 32) /* MD5:RSAv3 */
82         strncpy (buf+2, s+32-8, 8);
83     else
84         strncpy (buf+2, s+8, 8);
85     buf[10] = 0;
86     buf[0] = '0'; 
87     buf[1] = 'x';
88     SetDlgItemText (dlg, IDC_VRY_KEYID, buf);
89     /*key = find_gpg_key (buf+2, 0);*/
90     key = get_gpg_key (buf+2);
91     
92     stat = ctx->signatures->summary;
93     if (stat & GPGME_SIGSUM_GREEN)
94         s = "Good signature";
95     else if (stat & GPGME_SIGSUM_RED)
96         s = "BAD signature!";
97     else if (stat & GPGME_SIGSUM_KEY_REVOKED)
98         s = "Good signature from revoked key";
99     else if (stat & GPGME_SIGSUM_KEY_EXPIRED)
100         s = "Good signature from expired key";
101     else if (stat & GPGME_SIGSUM_SIG_EXPIRED)
102         s = "Good expired signature";
103     else if (stat & GPGME_SIGSUM_KEY_MISSING) {
104         s = "Could not check signature: missing key";
105         no_key = 1;
106     }
107     else
108         s = "Verification error";
109     /* XXX: if we have a key we do _NOT_ trust, stat is 'wrong' */
110     SetDlgItemText (dlg, IDC_VRY_STATUS, s);
111     
112     if (key) {
113         s = (char*)gpgme_key_get_string_attr (key, GPGME_ATTR_USERID, NULL, 0);
114         SetDlgItemText (dlg, IDC_VRY_ISSUER, s);
115
116         n = load_akalist (dlg, key);
117         gpgme_key_release (key);
118         if (n == 0)
119             EnableWindow (GetDlgItem (dlg, IDC_VRY_AKALIST), FALSE);
120     }
121     else {
122         s = "User-ID not found";
123         SetDlgItemText (dlg, IDC_VRY_ISSUER, s);
124     }
125
126     switch (ctx->signatures->pubkey_algo) {
127     case GPGME_PK_RSA: s = "RSA"; break;
128     case GPGME_PK_DSA: s = "DSA"; break;
129     default:           s = "???"; break;
130     }
131     SetDlgItemText (dlg, IDC_VRY_PKALGO, s);
132
133     valid = ctx->signatures->validity;
134     if (stat & GPGME_SIGSUM_SIG_EXPIRED) {
135         char *fmt;
136
137         fmt = "Signature expired on %s";
138         s = get_timestamp (ctx->signatures->exp_timestamp);
139         p = xmalloc (strlen (s)+1+strlen (fmt)+2);
140         sprintf (p, fmt, s);
141         SetDlgItemText (dlg, IDC_VRY_HINT, s);
142         xfree (p);
143     }
144     else if (valid < GPGME_VALIDITY_MARGINAL) {
145         switch (valid) {
146         case GPGME_VALIDITY_NEVER:
147             s = "Signature issued by a key we do NOT trust.";
148             break;
149
150         default:
151             if (no_key)
152                 s = "";
153             else
154                 s = "Signature issued by a non-valid key.";
155             break;
156         }
157         SetDlgItemText (dlg, IDC_VRY_HINT, s);
158     }
159 }
160
161
162 static BOOL CALLBACK
163 verify_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
164 {
165     static gpgme_verify_result_t ctx;
166
167     switch (msg) {
168     case WM_INITDIALOG:
169         ctx = (gpgme_verify_result_t)lparam;
170         load_sigbox (dlg, ctx);
171         center_window (dlg, NULL);
172         SetForegroundWindow (dlg);
173         break;
174
175     case WM_COMMAND:
176         switch (LOWORD(wparam)) {
177         case IDOK:
178             EndDialog (dlg, TRUE);
179             break;
180         }
181         break;
182     }
183     return FALSE;
184 }
185
186
187 /* Display the verify dialog based on the gpgme result in @res. */
188 int
189 verify_dialog_box (gpgme_verify_result_t res)
190 {
191     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_VRY, GetDesktopWindow (),
192                     verify_dlg_proc, (LPARAM)res);
193     return res->signatures->summary == GPGME_SIGSUM_GREEN? 0 : -1;
194 }