annotate cinst/mozilla.c @ 856:797aa8d9c785

(issue48) Fallback to HKEY_USERS on hive load failure If the hive can not be loaded it might mean that the user is currently logged on. In that case we can access his registry via HKEY_USERS.
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 31 Jul 2014 12:56:26 +0200
parents 2303caf56dbb
children 698b6a9bd75e
rev   line source
404
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
2 * Software engineering by Intevation GmbH
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
3 *
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
4 * This file is Free Software under the GNU GPL (v>=2)
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY!
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
6 * See LICENSE.txt for details.
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 390
diff changeset
7 */
121
4bb5f295987b Fix doxygen documentation.
Sascha Wilde <wilde@intevation.de>
parents: 119
diff changeset
8 /**
4bb5f295987b Fix doxygen documentation.
Sascha Wilde <wilde@intevation.de>
parents: 119
diff changeset
9 * @file
4bb5f295987b Fix doxygen documentation.
Sascha Wilde <wilde@intevation.de>
parents: 119
diff changeset
10 * @brief Mozilla installation process
99
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
11 *
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
12 * Reads from a file given on command line or stdin a list of
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
13 * instructions in the form:
99
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
14 *
238
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
15 * I:<base64 DER econded certificate>
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
16 * R:<base64 DER econded certificate>
99
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
17 * ...
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
18 *
238
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
19 * With one instruction per line. the maximum size of an input
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
20 * line is 9999 characters (including the \r\n) at the end of the line.
99
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
21 *
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
22 * Certificates marked with I: will be installed and the ones
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
23 * marked with R: will be searched and if available removed from
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
24 * the databases.
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
25 *
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
26 * This tool tries to find all NSS databases the user has
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
27 * access to and to execute the instructions on all of them.
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
28 *
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
29 * If there are other processes accessing the databases the caller
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
30 * has to ensure that those are terminated before this process is
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
31 * executed.
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
32 *
238
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
33 * If the same certificate is marked to be installed and to be removed
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
34 * in one call the behavior is undefined. This should be avoided and
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
35 * may lead to errors.
dd417a2ff9cd Specifiy unspecified behavior if there is an install and
Andre Heinecke <aheinecke@intevation.de>
parents: 235
diff changeset
36 *
99
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
37 * Returns 0 on success (Even when no stores where found) an error value
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
38 * as defined in errorcodes.h otherwise.
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
39 *
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
40 * Success messages are written to stdout. Errors to stderr. For logging
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
41 * purposes each installation / removal of a certificate will be reported
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
42 * with the profile name that it modified.
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
43 *
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
44 */
bc1e6732f43c Add specification and some cleanups
Andre Heinecke <aheinecke@intevation.de>
parents: 44
diff changeset
45
235
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
46 /**
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
47 * @brief Needs to eb defined to get strnlen()
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
48 */
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
49 #define _POSIX_C_SOURCE 200809L
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
50
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
51 /* REMOVEME: */
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
52 #include <unistd.h>
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
53
269
f7471604bb31 Deletion of certificates implemented.
Sascha Wilde <wilde@intevation.de>
parents: 268
diff changeset
54 #include <cert.h>
f7471604bb31 Deletion of certificates implemented.
Sascha Wilde <wilde@intevation.de>
parents: 268
diff changeset
55 #include <certdb.h>
f7471604bb31 Deletion of certificates implemented.
Sascha Wilde <wilde@intevation.de>
parents: 268
diff changeset
56 #include <certt.h>
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
57 #include <dirent.h>
224
689b94dd89a9 Wrote FindNSS to build against nss without pkg-config support (Windows).
Sascha Wilde <wilde@intevation.de>
parents: 223
diff changeset
58 #include <nss.h>
689b94dd89a9 Wrote FindNSS to build against nss without pkg-config support (Windows).
Sascha Wilde <wilde@intevation.de>
parents: 223
diff changeset
59 #include <pk11pub.h>
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
60 #include <stdbool.h>
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
61 #include <stdio.h>
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
62 #include <stdlib.h>
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
63 #include <string.h>
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
64 #include <sys/types.h>
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
65
230
92b1e5ed2d5f Cleanup and documentation in debugging macros.
Sascha Wilde <wilde@intevation.de>
parents: 229
diff changeset
66 #define DEBUGPREFIX "MOZ-"
252
bd7fb50078b4 Add logging.h for some logging / debug functions
Andre Heinecke <aheinecke@intevation.de>
parents: 246
diff changeset
67 #include "logging.h"
230
92b1e5ed2d5f Cleanup and documentation in debugging macros.
Sascha Wilde <wilde@intevation.de>
parents: 229
diff changeset
68
261
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
69 #include "certhelp.h"
226
d7788db3bdde Make locale includes distinguishable from system includes.
Sascha Wilde <wilde@intevation.de>
parents: 224
diff changeset
70 #include "errorcodes.h"
d7788db3bdde Make locale includes distinguishable from system includes.
Sascha Wilde <wilde@intevation.de>
parents: 224
diff changeset
71 #include "portpath.h"
d7788db3bdde Make locale includes distinguishable from system includes.
Sascha Wilde <wilde@intevation.de>
parents: 224
diff changeset
72 #include "strhelp.h"
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
73 #include "nss-secitemlist.h"
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
74
113
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
75 #ifndef _WIN32
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
76 #define CONFDIRS ".mozilla", ".thunderbird"
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
77 #define NSSSHARED ".pki/nssdb"
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
78 #define TARGET_LINUX 1
113
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
79 #else
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
80 #define CONFDIRS "Mozilla", "Thunderbird"
311
4ffc9f31b61a Fixed windows build.
Sascha Wilde <wilde@intevation.de>
parents: 309
diff changeset
81 #define NSSSHARED ""
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
82 #define TARGET_LINUX 0
113
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
83 #endif
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
84
229
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
85 /**
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
86 * @brief Length of string buffers used
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
87 *
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
88 * The maximal length of input is defined as 9999 (+ terminating \0).
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
89 * We use it for other other input puffers besides the IPC input, too.
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
90 * (One size fits all).
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
91 */
e99e39d72af2 Adjusted LINEBUFLEN.
Sascha Wilde <wilde@intevation.de>
parents: 228
diff changeset
92 #define LINEBUFLEN 10000
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
93
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
94 /**
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
95 * @brief Global Return Code
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
96 *
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
97 * This will be retuned by the programm and might be set to an
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
98 * error code on fatal errors and to and warning code on non-fatal
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
99 * errors. In case of mor than one warning the warning codes will be
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
100 * ORed together.
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
101 */
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
102 int exit_code = 0;
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
103
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
104 /**
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
105 * @brief Return configuration base directory.
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
106 * @returns A pointer to a string containing the path to the base
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
107 * directory holding the configuration directories for e.g. mozilla
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
108 * and thunderbird.
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
109 */
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
110 static char *
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
111 get_conf_basedir()
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
112 {
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
113 char *cdir, *envvar;
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
114
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
115 if (TARGET_LINUX)
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
116 envvar = "HOME" ;
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
117 else
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
118 envvar = "APPDATA";
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
119
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
120 if ((cdir = getenv(envvar)) != NULL)
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
121 return cdir;
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
122 else
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
123 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
124 DEBUGPRINTF("FATAL! No %s in environment.\n", envvar);
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
125 exit(ERR_MOZ_HOMELESS);
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
126 }
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
127 }
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
128
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
129 /**
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
130 * @brief Get a list of all mozilla profile directories
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
131 *
232
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
132 * Parse the profiles.ini and extract all profile paths from that.
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
133 * The expected data is in the form:
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
134 *
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
135 * [Profile99]
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
136 * IsRelative=1
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
137 * Path=Example/fooo.bar
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
138 *
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
139 * or
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
140 * [Profile0]
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
141 * IsRelative=0
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
142 * Path=c:\foo\bar\baz
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
143 *
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
144 * Mozilla also accepts the ini file on Windows even if it is UTF-16
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
145 * encoded but never writes UTF-16 on its own. So currently we ignore
774e944c395b Cleand up doku.
Sascha Wilde <wilde@intevation.de>
parents: 231
diff changeset
146 * this special case.
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
147 *
121
4bb5f295987b Fix doxygen documentation.
Sascha Wilde <wilde@intevation.de>
parents: 119
diff changeset
148 * @param[in] inifile_name path of the profile.ini to read.
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
149 * @return NULL terminated array of strings containing containing the
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
150 * absolute path of the profile directories. The array needs to
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
151 * be freed by the caller.
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
152 */
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
153 static char **
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
154 get_profile_dirs (char *inifile_name)
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
155 {
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
156 char **dirs = NULL;
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
157 char *inifile_dirname;
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
158 FILE *inifile;
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
159 char line[LINEBUFLEN];
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
160 char *key;
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
161 char *value;
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
162 char *path = NULL;
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
163 char *fqpath;
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
164 bool inprofile = false;
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
165 bool relative_path = false;
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
166
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
167 if ((inifile = fopen(inifile_name, "r")) != NULL)
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
168 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
169 DEBUGPRINTF("Searching for profile paths in: '%s'\n", inifile_name);
175
6fa0e12ae1d2 Added more debug output.
Sascha Wilde <wilde@intevation.de>
parents: 174
diff changeset
170
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
171 inifile_dirname = port_dirname(inifile_name);
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
172 while (fgets(line, LINEBUFLEN, inifile) != NULL)
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
173 {
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
174 /* Determine if we are in an profile section */
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
175 if (str_starts_with(line, "[Profile"))
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
176 {
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
177 relative_path = false;
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
178 inprofile = true;
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
179 }
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
180 else if (line[0] == '[')
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
181 inprofile = false;
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
182
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
183 /* If we are in a profile parse path related stuff */
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
184 if (inprofile)
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
185 {
157
a46a4b443410 Use strtok instead of strsep for portability.
Sascha Wilde <wilde@intevation.de>
parents: 147
diff changeset
186 key = strtok(line, "=");
a46a4b443410 Use strtok instead of strsep for portability.
Sascha Wilde <wilde@intevation.de>
parents: 147
diff changeset
187 value = strtok(NULL, "=");
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
188 str_trim(&value);
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
189 if (str_equal(key, "Path"))
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
190 {
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
191 if (relative_path)
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
192 xasprintf(&path, "%s/%s", inifile_dirname, value);
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
193 else
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
194 xasprintf(&path, "%s", value); /* FIXME: LOOKS STUPID! */
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
195 if ((fqpath = port_realpath(path)) != NULL)
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
196 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
197 DEBUGPRINTF("Found profile path: '%s'\n", fqpath);
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
198 strv_append(&dirs, fqpath, strlen(fqpath));
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
199 free (fqpath);
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
200 }
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
201 else
175
6fa0e12ae1d2 Added more debug output.
Sascha Wilde <wilde@intevation.de>
parents: 174
diff changeset
202 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
203 DEBUGPRINTF("WARN! Non existent profile path: '%s'\n", path);
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
204 exit_code |= WARN_MOZ_PROFILE_DOES_NOT_EXIST;
175
6fa0e12ae1d2 Added more debug output.
Sascha Wilde <wilde@intevation.de>
parents: 174
diff changeset
205 }
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
206 free(path);
147
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
207 }
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
208 else if (str_equal(key, "IsRelative") &&
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
209 str_starts_with(value, "1"))
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
210 relative_path = true;
fc9af77b06b9 Completed profile.ini parser.
Sascha Wilde <wilde@intevation.de>
parents: 130
diff changeset
211 }
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
212 }
179
8fafd0fc2173 get_profile_dirs(): close filedescriptor again. (found by cppcheck)
Bernhard Reiter <bernhard@intevation.de>
parents: 177
diff changeset
213 fclose(inifile);
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
214 }
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
215 else
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
216 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
217 DEBUGPRINTF("WARN! Could not open ini file: '%s'\n", inifile_name);
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
218 exit_code |= WARN_MOZ_FAILED_TO_OPEN_INI;
119
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
219 }
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
220 return dirs;
24ca8e2ceecf First step of simple mozilla ini parser
Sascha Wilde <wilde@intevation.de>
parents: 113
diff changeset
221 }
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
222
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
223 /**
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
224 * @brief Search for mozilla profiles.ini files
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
225 *
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
226 * Use well known paths and heuristics to find the current users
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
227 * profiles.ini files on GNU/Linux and Windows systems.
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
228 *
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
229 * @return NULL terminated array of strings containing the absolute
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
230 * path of the profiles.ini files. The array needs to be freed by the
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
231 * caller.
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
232 */
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
233 static char **
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
234 get_profile_inis ()
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
235 {
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
236 char **inis = NULL;
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
237 char *mozpath, *fqpath, *subpath, *ppath;
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
238 DIR *mozdir;
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
239 struct dirent *mozdirent;
194
d4e97c9b199f Use %APPDATA% as config bse dir on windows. Much simpler.
Sascha Wilde <wilde@intevation.de>
parents: 181
diff changeset
240 char *confbase = get_conf_basedir();
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
241 const char *confdirs[] = { CONFDIRS, NULL };
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
242
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
243 for (int i=0; confdirs[i] != NULL; i++)
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
244 {
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
245 xasprintf(&mozpath,"%s/%s", confbase, confdirs[i]);
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
246 if ((mozdir = opendir(mozpath)) != NULL)
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
247 {
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
248 while ((mozdirent = readdir(mozdir)) != NULL)
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
249 {
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
250 xasprintf(&subpath, "%s/%s/%s",
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
251 confbase,
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
252 confdirs[i],
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
253 mozdirent->d_name);
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
254 if (port_isdir(subpath)
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
255 && (strcmp(mozdirent->d_name, "..") != 0))
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
256 {
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
257 xasprintf(&ppath, "%s/%s/%s/%s",
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
258 confbase,
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
259 confdirs[i],
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
260 mozdirent->d_name,
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
261 "profiles.ini");
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
262 DEBUGPRINTF("checking for %s...\n", ppath);
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
263 if ((fqpath = port_realpath(ppath)) != NULL)
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
264 {
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
265 strv_append(&inis, fqpath, strlen(fqpath));
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
266 DEBUGPRINTF("Found mozilla ini file: '%s'\n", fqpath);
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
267 free(fqpath);
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
268 }
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
269 free(ppath);
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
270 }
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
271 free(subpath);
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
272 }
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
273 closedir(mozdir);
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
274 }
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
275 else
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
276 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
277 DEBUGPRINTF("Could not open %s/%s\n", confbase, confdirs[i]);
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
278 }
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
279 free(mozpath);
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
280 }
197
5d380b662198 Search for thunderbird profiles, too.
Sascha Wilde <wilde@intevation.de>
parents: 195
diff changeset
281 if (inis == NULL)
180
344b8a79ad2e Implemented detection profile paths for Windows Vista/7.
Sascha Wilde <wilde@intevation.de>
parents: 177
diff changeset
282 {
228
19de529ce7fb Moved debug prefix to macro and added component specific prefix.
Sascha Wilde <wilde@intevation.de>
parents: 227
diff changeset
283 DEBUGPRINTF("No ini files found - will do nothing!\n");
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
284 }
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
285 return inis;
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
286 }
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
287
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
288 /**
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
289 * @brief Collect all mozilla profile directories of current user.
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
290 * @return NULL terminated array of strings containing the absolute
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
291 * path of the profile directories. The array needs to be freed by the
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
292 * caller.
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
293 */
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
294 static char**
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
295 get_all_nssdb_dirs()
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
296 {
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
297 char **mozinis, **pdirs;
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
298 char **alldirs = NULL;
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
299 /* Search Mozilla/Firefox/Thunderbird profiles */
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
300 if ((mozinis = get_profile_inis()) != NULL)
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
301 {
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
302 for (int i=0; mozinis[i] != NULL; i++)
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
303 {
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
304 pdirs =
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
305 get_profile_dirs(mozinis[i]);
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
306 if (pdirs != NULL)
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
307 {
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
308 for (int i=0; pdirs[i] != NULL; i++)
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
309 {
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
310 strv_append(&alldirs, pdirs[i], strlen(pdirs[i]));
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
311 }
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
312 strv_free(pdirs);
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
313 }
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
314 }
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
315 strv_free(mozinis);
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
316 }
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
317 /* Search for NSS shared DB (used by Chrome/Chromium on GNU/Linux) */
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
318 if (TARGET_LINUX)
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
319 {
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
320 char *path, *fqpath, *sqlpath;
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
321 xasprintf(&path, "%s/%s", get_conf_basedir(), NSSSHARED);
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
322 if ((fqpath = port_realpath(path)) != NULL)
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
323 {
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
324 xasprintf(&sqlpath, "sql:%s", fqpath);
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
325 strv_append(&alldirs, sqlpath, strlen(sqlpath));
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
326 free(sqlpath);
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
327 free(fqpath);
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
328 }
320
1628615d904e Replaced snprintf and static buffers with xasprintf.
Sascha Wilde <wilde@intevation.de>
parents: 317
diff changeset
329 free(path);
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
330 }
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
331 return alldirs;
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
332 }
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
333
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
334 #ifdef DEBUGOUTPUT
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
335 /**
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
336 * @brief list certificates from nss certificate store
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
337 * @param[in] confdir the directory with the certificate store
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
338 */
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
339 static void
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
340 DEBUG_nss_list_certs (char *confdir)
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
341 {
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
342 CERTCertList *list;
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
343 CERTCertListNode *node;
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
344 char *name;
224
689b94dd89a9 Wrote FindNSS to build against nss without pkg-config support (Windows).
Sascha Wilde <wilde@intevation.de>
parents: 223
diff changeset
345
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
346 if (NSS_Initialize(confdir, "", "", "secmod.db", NSS_INIT_READONLY)
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
347 == SECSuccess)
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
348 {
283
fb9e14f4b4c9 Show which store is listed in debug certificate listings.
Sascha Wilde <wilde@intevation.de>
parents: 281
diff changeset
349 DEBUGPRINTF("Listing certs in \"%s\"\n", confdir);
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
350 list = PK11_ListCerts(PK11CertListAll, NULL);
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
351 for (node = CERT_LIST_HEAD(list); !CERT_LIST_END(node, list);
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
352 node = CERT_LIST_NEXT(node)) {
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
353 name = node->appData;
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
354
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
355 DEBUGPRINTF("Found certificate \"%s\"\n", name);
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
356 }
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
357 CERT_DestroyCertList(list);
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
358 NSS_Shutdown();
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
359 }
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
360 else
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
361 {
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
362 DEBUGPRINTF("Could not open nss certificate store in %s!\n", confdir);
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
363 }
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
364 }
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
365 #endif
223
d29997e09177 NSS first Blood. Added code to list certs in found stores.
Sascha Wilde <wilde@intevation.de>
parents: 197
diff changeset
366
261
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
367 /**
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
368 * @brief Create a string with the name for cert in SECItem.
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
369 *
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
370 * Should be freed by caller.
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
371 * @param[in] secitemp ponts to an SECItem holding the DER certificate.
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
372 * @retruns a string of the from "CN of Subject - O of Subject"
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
373 */
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
374 static char *
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
375 nss_cert_name(SECItem *secitemp)
390
eab288779e07 Added debug output in NSS_cert_name on failure
Andre Heinecke <andre.heinecke@intevation.de>
parents: 332
diff changeset
376 {
eab288779e07 Added debug output in NSS_cert_name on failure
Andre Heinecke <andre.heinecke@intevation.de>
parents: 332
diff changeset
377 char *cn_str, *o_str, *name;
261
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
378 size_t name_len;
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
379 cn_str = x509_parse_subject(secitemp->data, secitemp->len, CERT_OID_CN);
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
380 o_str = x509_parse_subject(secitemp->data, secitemp->len, CERT_OID_O);
332
81a205fc651e Do not exit on error
Andre Heinecke <aheinecke@intevation.de>
parents: 322
diff changeset
381 if (!cn_str || !o_str)
81a205fc651e Do not exit on error
Andre Heinecke <aheinecke@intevation.de>
parents: 322
diff changeset
382 {
81a205fc651e Do not exit on error
Andre Heinecke <aheinecke@intevation.de>
parents: 322
diff changeset
383 DEBUGPRINTF("FATAL: Could not parse certificate!");
81a205fc651e Do not exit on error
Andre Heinecke <aheinecke@intevation.de>
parents: 322
diff changeset
384 exit(ERR_INVALID_CERT);
81a205fc651e Do not exit on error
Andre Heinecke <aheinecke@intevation.de>
parents: 322
diff changeset
385 }
261
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
386 name_len = strlen(cn_str) + strlen(o_str) + 4;
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
387 name = (char *)xmalloc(name_len);
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
388 snprintf(name, name_len, "%s - %s", cn_str, o_str);
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
389 free(cn_str);
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
390 free(o_str);
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
391 return name;
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
392 }
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
393
276
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
394 /**
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
395 * @brief Convert a base64 encoded DER certificate to SECItem
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
396 * @param[in] b64 pointer to the base64 encoded certificate
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
397 * @param[in] b64len length of the base64 encoded certificate
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
398 * @param[out] secitem pointer to the SECItem in which to store the
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
399 * raw DER certifiacte.
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
400 * @returns true on success and false on failure
ea9c5bbc6496 Added missing function documentation.
Sascha Wilde <wilde@intevation.de>
parents: 269
diff changeset
401 */
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
402 static bool
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
403 base64_to_secitem(char *b64, size_t b64len, SECItem *secitem)
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
404 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
405 unsigned char *dercert = NULL;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
406 size_t dercertlen;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
407
245
fbd74e2370de Error out, when base64 decode results in empty data.
Sascha Wilde <wilde@intevation.de>
parents: 244
diff changeset
408 if ((str_base64_decode((char **)(&dercert), &dercertlen,
fbd74e2370de Error out, when base64 decode results in empty data.
Sascha Wilde <wilde@intevation.de>
parents: 244
diff changeset
409 b64, b64len) == 0) &&
fbd74e2370de Error out, when base64 decode results in empty data.
Sascha Wilde <wilde@intevation.de>
parents: 244
diff changeset
410 (dercertlen > 0))
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
411 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
412 secitem->data = dercert;
246
1efe494c3d2b Explicit tyoe cast to fix warning on 64bit Jessie.
Sascha Wilde <wilde@intevation.de>
parents: 245
diff changeset
413 secitem->len = (unsigned int) dercertlen;
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
414 return true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
415 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
416 else
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
417 {
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
418 DEBUGPRINTF("Base64 decode failed for: %s\n", b64);
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
419 }
261
7707191ddb01 New function to generate certificate name.
Sascha Wilde <wilde@intevation.de>
parents: 252
diff changeset
420 return false;
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
421 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
422
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
423 /**
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
424 * @brief Store DER certificate in mozilla store.
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
425 * @param[in] pdir the mozilla profile directory with the certificate
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
426 * store to manipulate.
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
427 * @param[in] dercert pointer to a SECItem holding the DER certificate
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
428 * to install
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
429 * @returns true on success and false on failure
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
430 */
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
431 static bool
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
432 import_cert(char *pdir, SECItem *dercert)
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
433 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
434 PK11SlotInfo *pk11slot = NULL;
309
fa37384b86b6 Add trust "Trusted CA to issue server certificates" to certs on install.
Sascha Wilde <wilde@intevation.de>
parents: 308
diff changeset
435 CERTCertTrust *trust = NULL;
fa37384b86b6 Add trust "Trusted CA to issue server certificates" to certs on install.
Sascha Wilde <wilde@intevation.de>
parents: 308
diff changeset
436 CERTCertificate *cert = NULL;
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
437 bool success = false;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
438 char *cert_name = nss_cert_name(dercert);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
439
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
440 DEBUGPRINTF("INSTALLING cert: '%s' to: %s\n", cert_name, pdir);
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
441 pk11slot = PK11_GetInternalKeySlot();
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
442 cert = CERT_DecodeCertFromPackage((char *)dercert->data,
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
443 (int)dercert->len);
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
444 trust = (CERTCertTrust *)xmalloc(sizeof(CERTCertTrust));
595
2c4eb4435a40 Set trust also for S/MIME and Codesigning
Andre Heinecke <aheinecke@intevation.de>
parents: 564
diff changeset
445 CERT_DecodeTrustString(trust, "C,C,C");
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
446 if ((PK11_ImportCert(pk11slot, cert, CK_INVALID_HANDLE,
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
447 cert_name, PR_FALSE)
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
448 == SECSuccess) &&
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
449 (CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, trust)
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
450 == SECSuccess))
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
451 {
625
2303caf56dbb Add logging function for der data and add logging to NSS installation
Andre Heinecke <andre.heinecke@intevation.de>
parents: 595
diff changeset
452 log_certificate_der (pdir, dercert->data, dercert->len, true);
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
453 success = true;
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
454 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
455 else
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
456 {
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
457 DEBUGPRINTF("Failed to install certificate '%s' to '%s'!\n", cert_name, pdir);
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
458 ERRORPRINTF("Error installing certificate err: %i\n", PORT_GetError());
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
459 }
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
460 CERT_DestroyCertificate (cert);
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
461 free(trust);
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
462 PK11_FreeSlot(pk11slot);
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
463
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
464 free(cert_name);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
465 return success;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
466 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
467
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
468 /**
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
469 * @brief Remove DER certificate from mozilla store.
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
470 * @param[in] pdir the mozilla profile directory with the certificate
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
471 * store to manipulate.
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
472 * @param[in] dercert pointer to a SECItem holding the DER certificate
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
473 * to remove
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
474 * @returns true on success and false on failure
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
475 */
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
476 static bool
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
477 remove_cert(char *pdir, SECItem *dercert)
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
478 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
479 PK11SlotInfo *pk11slot = NULL;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
480 bool success = false;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
481 char *cert_name = nss_cert_name(dercert);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
482 CERTCertificate *cert = NULL;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
483
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
484 DEBUGPRINTF("REMOVING cert: '%s' from: %s\n", cert_name, pdir);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
485 if (NSS_Initialize(pdir, "", "", "secmod.db", 0) == SECSuccess)
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
486 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
487 pk11slot = PK11_GetInternalKeySlot();
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
488 cert = PK11_FindCertFromDERCertItem(pk11slot,
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
489 dercert, NULL);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
490 if (cert != NULL)
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
491 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
492 if (SEC_DeletePermCertificate(cert) == SECSuccess)
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
493 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
494 success = true;
625
2303caf56dbb Add logging function for der data and add logging to NSS installation
Andre Heinecke <andre.heinecke@intevation.de>
parents: 595
diff changeset
495 log_certificate_der (pdir, dercert->data, dercert->len, false);
277
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
496 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
497 else
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
498 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
499 DEBUGPRINTF("Failed to remove certificate '%s' from '%s'!\n", cert_name, pdir);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
500 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
501 CERT_DestroyCertificate(cert);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
502 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
503 else
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
504 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
505 DEBUGPRINTF("Could not find Certificate '%s' in store '%s'.\n", cert_name, pdir);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
506 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
507 PK11_FreeSlot(pk11slot);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
508 NSS_Shutdown();
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
509 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
510 else
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
511 {
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
512 DEBUGPRINTF("Could not open nss certificate store in %s!\n", pdir);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
513 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
514 free(cert_name);
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
515 return success;
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
516 }
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
517
22408d797c92 Factor out functions for cert install/remove.
Sascha Wilde <wilde@intevation.de>
parents: 276
diff changeset
518 /**
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
519 * @brief Apply a function to a list of certificates and profiles
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
520 *
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
521 * The function must have the signature:
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
522 *
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
523 * bool function(char *pdir, SECItem der_cert)
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
524 *
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
525 * where pdir is the path of an profile and der_cert is an raw DER
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
526 * formatted certificate. The function must return true on success
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
527 * and false on failure.
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
528 *
625
2303caf56dbb Add logging function for der data and add logging to NSS installation
Andre Heinecke <andre.heinecke@intevation.de>
parents: 595
diff changeset
529 * This function is intended for use with the import_cert and
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
530 * remove_cert functions.
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
531 *
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
532 * @param[in] fn the function to apply
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
533 * @param[inout] certs a secitem list holding the certificates
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
534 * the list will be change (emptied)!
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
535 * @param[in] pdirs the NULL terminated list of profile directories
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
536 * @returns true on success and false on failure
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
537 */
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
538 bool
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
539 apply_to_certs_and_profiles(bool fn(char *, SECItem *),
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
540 seciteml_t **certs, char **pdirs)
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
541 {
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
542 bool success = true;
280
6c4b3ff4a356 Fixed white space.
Sascha Wilde <wilde@intevation.de>
parents: 279
diff changeset
543
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
544 for (int i=0; pdirs[i] != NULL; i++)
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
545 {
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
546 seciteml_t *iter = *certs;
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
547 if (NSS_Initialize(pdirs[i], "", "", "secmod.db", 0) != SECSuccess)
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
548 {
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
549 DEBUGPRINTF("Could not open nss certificate store in %s!\n", pdirs[i]);
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
550 continue;
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
551 }
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
552
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
553 while (iter != NULL && iter->item != NULL)
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
554 {
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
555 SECItem *cert = iter->item;
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
556 if (! (*fn)(pdirs[i], cert))
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
557 success = false;
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
558 iter = iter->next;
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
559 }
493
48d7b956bd98 Change loop order of installation to only call NSS_Initialize once per db
Andre Heinecke <aheinecke@intevation.de>
parents: 489
diff changeset
560 NSS_Shutdown();
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
561 }
280
6c4b3ff4a356 Fixed white space.
Sascha Wilde <wilde@intevation.de>
parents: 279
diff changeset
562
564
f115da3645d5 Free secitem list after usage.
Andre Heinecke <aheinecke@intevation.de>
parents: 493
diff changeset
563 seciteml_free(certs);
f115da3645d5 Free secitem list after usage.
Andre Heinecke <aheinecke@intevation.de>
parents: 493
diff changeset
564
279
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
565 return success;
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
566 }
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
567
cb5f082e90c5 Factor out the iteration over profiles and certs.
Sascha Wilde <wilde@intevation.de>
parents: 278
diff changeset
568 /**
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
569 * @brief Parse IPC commands from standard input.
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
570 *
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
571 * Reads command lines (R: and I:) from standard input and puts the
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
572 * certificates to process in two SECItem lists holding the
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
573 * certificates in DER format.
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
574 * @param[inout] install_list list of SECItems with certifiactes to install
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
575 * @param[inout] remove_list list of SECItems with certifiactes to remove
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
576 */
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
577 static void
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
578 parse_commands (FILE *stream,
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
579 seciteml_t **install_list, seciteml_t **remove_list)
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
580 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
581 char inpl[LINEBUFLEN];
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
582 size_t inpllen;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
583 bool parserr = true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
584 SECItem secitem;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
585
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
586 while ( fgets(inpl, LINEBUFLEN, stream) != NULL )
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
587 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
588 inpllen = strnlen(inpl, LINEBUFLEN);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
589 /* Validate input line:
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
590 * - must be (much) longer than 3 characters
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
591 * - must start with "*:"
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
592 */
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
593 if ((inpllen > 3) && (inpl[1] == ':'))
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
594 /* Now parse Input */
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
595 switch(inpl[0])
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
596 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
597 case 'R':
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
598 parserr = true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
599 DEBUGPRINTF("Request to remove certificate: %s\n", &inpl[2]);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
600 if (base64_to_secitem(&inpl[2], inpllen - 2, &secitem))
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
601 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
602 seciteml_push(remove_list, &secitem);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
603 parserr = false;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
604 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
605 break;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
606 case 'I':
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
607 parserr = true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
608 DEBUGPRINTF("Request to install certificate: %s\n", &inpl[2]);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
609 if (base64_to_secitem(&inpl[2], inpllen - 2, &secitem))
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
610 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
611 seciteml_push(install_list, &secitem);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
612 parserr = false;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
613 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
614 break;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
615 default:
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
616 parserr = true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
617 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
618 else
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
619 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
620 parserr = true;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
621 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
622
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
623 if (parserr)
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
624 {
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
625 DEBUGPRINTF("FATAL: Invalid input: %s\n", inpl);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
626 exit(ERR_MOZ_INVALID_INPUT);
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
627 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
628 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
629 }
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
630
173
a9e4454dee97 Implemented searching $HOME/.mozilla for profiles.ini on Linux.
Sascha Wilde <wilde@intevation.de>
parents: 157
diff changeset
631
113
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
632 int
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
633 main (int argc, char **argv)
113
02ad0922c01f Start over (only leave comments).
Sascha Wilde <wilde@intevation.de>
parents: 110
diff changeset
634 {
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
635 char **dbdirs;
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
636 seciteml_t *certs_to_remove = NULL;
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
637 seciteml_t *certs_to_add = NULL;
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
638 FILE *input_stream;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
639
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
640 switch (argc)
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
641 {
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
642 case 1:
322
e30c9fee111a Typo in debug output.
Sascha Wilde <wilde@intevation.de>
parents: 320
diff changeset
643 DEBUGPRINTF("Opening STDIN for input...\n");
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
644 input_stream = stdin;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
645 break;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
646 case 2:
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
647 DEBUGPRINTF("Opening %s for input...\n", argv[1]);
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
648 if ((input_stream = fopen(argv[1], "r")) == NULL)
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
649 {
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
650 DEBUGPRINTF("FATAL: Could not open %s for reading!\n",
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
651 argv[1]);
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
652 exit_code = ERR_MOZ_FAILED_TO_OPEN_INPUT;
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
653 goto exit;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
654 }
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
655 break;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
656 default:
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
657 DEBUGPRINTF("FATAL: Wrong number of arguments!\n");
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
658 exit_code = ERR_MOZ_WRONG_ARGC;
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
659 goto exit;
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
660 }
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
661
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
662 dbdirs =
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
663 get_all_nssdb_dirs();
235
0c4d65a7cd14 Started to write input parser.
Sascha Wilde <wilde@intevation.de>
parents: 232
diff changeset
664
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
665 if (dbdirs != NULL)
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
666 {
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
667 parse_commands(input_stream, &certs_to_add, &certs_to_remove);
244
0145d2401f46 Input parser works. Added debug output for collected cert data.
Sascha Wilde <wilde@intevation.de>
parents: 243
diff changeset
668
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
669 #ifdef DEBUGOUTPUT
284
a0c5eba8eb41 Added missing line breaks in debug output.
Sascha Wilde <wilde@intevation.de>
parents: 283
diff changeset
670 DEBUGPRINTF("OLD List of installed certs:\n");
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
671 for (int i=0; dbdirs[i] != NULL; i++)
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
672 DEBUG_nss_list_certs(dbdirs[i]);
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
673 #endif
263
1fa607af6332 Next baby step: we can import certificates!
Sascha Wilde <wilde@intevation.de>
parents: 261
diff changeset
674
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
675 if (! apply_to_certs_and_profiles(remove_cert, &certs_to_remove, dbdirs))
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
676 exit_code |= WARN_MOZ_COULD_NOT_REMOVE_CERT;
280
6c4b3ff4a356 Fixed white space.
Sascha Wilde <wilde@intevation.de>
parents: 279
diff changeset
677
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
678 if (! apply_to_certs_and_profiles(import_cert, &certs_to_add, dbdirs))
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
679 exit_code |= WARN_MOZ_COULD_NOT_ADD_CERT;
280
6c4b3ff4a356 Fixed white space.
Sascha Wilde <wilde@intevation.de>
parents: 279
diff changeset
680
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
681 #ifdef DEBUGOUTPUT
284
a0c5eba8eb41 Added missing line breaks in debug output.
Sascha Wilde <wilde@intevation.de>
parents: 283
diff changeset
682 DEBUGPRINTF("NEW List of installed certs:\n");
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
683 for (int i=0; dbdirs[i] != NULL; i++)
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
684 DEBUG_nss_list_certs(dbdirs[i]);
281
0f73fe4230c1 Fixed and optimized production build.
Sascha Wilde <wilde@intevation.de>
parents: 280
diff changeset
685 #endif
280
6c4b3ff4a356 Fixed white space.
Sascha Wilde <wilde@intevation.de>
parents: 279
diff changeset
686
308
ab69d268b5c8 Add NSS shared DB on Linux to stores operated on.
Sascha Wilde <wilde@intevation.de>
parents: 284
diff changeset
687 strv_free(dbdirs);
231
c342b93c5bd1 Refactoring.
Sascha Wilde <wilde@intevation.de>
parents: 230
diff changeset
688 }
315
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
689
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
690 fclose(input_stream);
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
691
b832231640ab Read from file instead of stdin, if given.
Sascha Wilde <wilde@intevation.de>
parents: 312
diff changeset
692 exit:
317
46fd11699646 Renamed exit code from return_code to exit_code.
Sascha Wilde <wilde@intevation.de>
parents: 315
diff changeset
693 exit(exit_code);
44
b3e8e047bc2c Commit first scratch of mozilla installer
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
694 }

http://wald.intevation.org/projects/trustbridge/