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