Mercurial > trustbridge
annotate cinst/windowsstore.c @ 351:ee59ab0eb7ff
Add test for Certificate::fromFile
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Thu, 10 Apr 2014 15:31:02 +0200 |
parents | 824ef90a6721 |
children | 17e1c8f37d72 |
rev | line source |
---|---|
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
1 #ifdef WIN32 |
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
2 |
161
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
3 #include <stdio.h> |
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
4 |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
5 #include "windowsstore.h" |
161
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
6 #include "errorcodes.h" |
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
7 #include "listutil.h" |
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
8 #include "strhelp.h" |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
9 #include "logging.h" |
321
824ef90a6721
Move is_elevated into common/util.c file for better reuse
Andre Heinecke <aheinecke@intevation.de>
parents:
262
diff
changeset
|
10 #include "util.h" |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
11 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
12 static PCCERT_CONTEXT |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
13 b64_to_cert_context(char *b64_data, size_t b64_size) |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
14 { |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
15 size_t buf_size = 0; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
16 char *buf = NULL; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
17 PCCERT_CONTEXT pCert = NULL; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
18 int ret = -1; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
19 |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
20 ret = str_base64_decode (&buf, &buf_size, b64_data, b64_size); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
21 |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
22 if (ret != 0) |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
23 { |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
24 printf ("decoding certificate failed\n"); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
25 return NULL; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
26 } |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
27 |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
28 pCert = CertCreateContext (CERT_STORE_CERTIFICATE_CONTEXT, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
29 X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
30 (const PBYTE) buf, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
31 (DWORD) buf_size, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
32 0, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
33 NULL); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
34 free (buf); /* Windows has a copy */ |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
35 |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
36 if (pCert == NULL) |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
37 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
38 char *error = getLastErrorMsg(); |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
39 if (error) |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
40 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
41 printf ("Failed to create cert context: %s \n", error); |
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
42 free (error); |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
43 } |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
44 return NULL; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
45 } |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
46 return pCert; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
47 } |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
48 |
219
57bef180d560
Add debug output and make windowsstore linkable from C++ code
Andre Heinecke <andre.heinecke@intevation.de>
parents:
218
diff
changeset
|
49 void |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
50 do_remove(HCERTSTORE hStore, char **to_remove) |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
51 { |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
52 PCCERT_CONTEXT pCert = NULL; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
53 unsigned int i = 0; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
54 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
55 if (!to_remove) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
56 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
57 return; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
58 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
59 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
60 for (i=0; to_remove[i]; i++) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
61 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
62 PCCERT_CONTEXT pc_to_remove = NULL; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
63 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
64 pc_to_remove = b64_to_cert_context(to_remove[i], |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
65 strnlen(to_remove[i], MAX_LINE_LENGTH)); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
66 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
67 if (pc_to_remove == NULL) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
68 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
69 char *error = getLastErrorMsg(); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
70 if (error) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
71 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
72 printf ("Failed to create cert context: %s \n", error); |
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
73 free (error); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
74 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
75 continue; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
76 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
77 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
78 pCert = CertFindCertificateInStore (hStore, |
218
8fb12af98960
According to MSDN you Must also provide message encoding flag.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
217
diff
changeset
|
79 X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
80 0, |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
81 CERT_FIND_EXISTING, |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
82 pc_to_remove, |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
83 NULL); |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
84 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
85 CertFreeCertificateContext (pc_to_remove); |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
86 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
87 if (pCert == NULL) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
88 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
89 printf ("Did not find certificate\n"); |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
90 continue; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
91 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
92 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
93 if (!CertDeleteCertificateFromStore (pCert)) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
94 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
95 /* From MSDN: |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
96 The CertDeleteCertificateFromStore function always frees |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
97 pCertContext by calling the CertFreeCertificateContext |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
98 function, even if an error is encountered. */ |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
99 char *error = getLastErrorMsg(); |
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
100 printf ("Error deleting certificate. %s", error); |
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
101 free (error); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
102 continue; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
103 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
104 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
105 return; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
106 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
107 |
219
57bef180d560
Add debug output and make windowsstore linkable from C++ code
Andre Heinecke <andre.heinecke@intevation.de>
parents:
218
diff
changeset
|
108 void |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
109 do_install(HCERTSTORE hStore, char **to_install) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
110 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
111 int i = 0, |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
112 ret = -1; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
113 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
114 if (!to_install) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
115 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
116 return; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
117 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
118 |
217
83a015f2e078
Remove leftover incrementation of i from former loop style. Fixes a crash when adding only one
Andre Heinecke <andre.heinecke@intevation.de>
parents:
215
diff
changeset
|
119 for (i = 0; to_install[i]; i++) |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
120 { |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
121 PCCERT_CONTEXT pc_to_add = NULL; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
122 PCCERT_CONTEXT found_cert = NULL; |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
123 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
124 pc_to_add = b64_to_cert_context(to_install[i], |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
125 strnlen(to_install[i], MAX_LINE_LENGTH)); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
126 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
127 if (pc_to_add == NULL) |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
128 { |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
129 continue; |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
130 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
131 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
132 found_cert = CertFindCertificateInStore (hStore, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
133 X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
134 0, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
135 CERT_FIND_EXISTING, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
136 pc_to_add, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
137 NULL); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
138 if (found_cert != NULL) |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
139 { |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
140 printf ("Certificate already in store\n"); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
141 CertFreeCertificateContext (found_cert); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
142 CertFreeCertificateContext (pc_to_add); |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
143 continue; |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
144 } |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
145 |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
146 ret = CertAddCertificateContextToStore (hStore, |
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
147 pc_to_add, |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
148 CERT_STORE_ADD_ALWAYS, |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
149 NULL); |
222
53ea9b975d1c
Cleanup windowsstore.c
Andre Heinecke <aheinecke@intevation.de>
parents:
219
diff
changeset
|
150 CertFreeCertificateContext (pc_to_add); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
151 if (!ret) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
152 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
153 char *error = getLastErrorMsg(); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
154 if (error) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
155 { |
253
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
156 printf ("Failed to add certificate: %s \n", error); |
3595ea4fd3fb
Use getLastErrorMsg from logging
Andre Heinecke <aheinecke@intevation.de>
parents:
247
diff
changeset
|
157 free (error); |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
158 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
159 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
160 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
161 return; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
162 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
163 |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
164 int |
247
4de97f74d038
Check for process elevation and write into system store accordingly
Andre Heinecke <aheinecke@intevation.de>
parents:
222
diff
changeset
|
165 write_stores_win (char **to_install, char **to_remove) |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
166 { |
163
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
167 HCERTSTORE hStore = NULL; |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
168 |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
169 if (!to_install && !to_remove) |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
170 { |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
171 /* Nothing to do */ |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
172 return 0; |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
173 } |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
174 |
247
4de97f74d038
Check for process elevation and write into system store accordingly
Andre Heinecke <aheinecke@intevation.de>
parents:
222
diff
changeset
|
175 if (!is_elevated()) |
163
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
176 { |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
177 hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0, |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
178 0, CERT_SYSTEM_STORE_CURRENT_USER, L"Root"); |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
179 } |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
180 else |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
181 { |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
182 hStore = CertOpenStore (CERT_STORE_PROV_SYSTEM, 0, |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
183 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root"); |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
184 } |
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
185 |
163
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
186 if (!hStore) |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
187 { |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
188 return ERR_STORE_ACCESS_DENIED; |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
189 } |
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
190 |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
191 /* Do the actual work */ |
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
192 do_install (hStore, to_install); |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
193 |
215
292e2cb60ef0
Add removal of certificates
Andre Heinecke <andre.heinecke@intevation.de>
parents:
185
diff
changeset
|
194 do_remove (hStore, to_remove); |
161
a4b1c77f3e6a
Change install_certificates_win to generic write_stores_win
Andre Heinecke <aheinecke@intevation.de>
parents:
149
diff
changeset
|
195 |
163
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
196 if (hStore) |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
197 { |
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
198 CertCloseStore (hStore, 0); |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
199 } |
163
8cfcd38a9bb3
Change coding style for cinst main / windowsstore to GNU
Andre Heinecke <aheinecke@intevation.de>
parents:
161
diff
changeset
|
200 return 0; |
137
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
201 } |
4904fe01055d
Factor out windows specific parts
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
202 #endif // WIN32 |