Mercurial > trustbridge
comparison cinst/mozilla.c @ 978:d92b1594e974
Merged.
author | Emanuel Schuetze <emanuel@intevation.de> |
---|---|
date | Fri, 29 Aug 2014 13:10:11 +0200 |
parents | b3695a3399de |
children | 1743895b39b8 |
comparison
equal
deleted
inserted
replaced
977:9ad1f18799fb | 978:d92b1594e974 |
---|---|
24 * the databases. | 24 * the databases. |
25 * | 25 * |
26 * This tool tries to find all NSS databases the user has | 26 * This tool tries to find all NSS databases the user has |
27 * access to and to execute the instructions on all of them. | 27 * access to and to execute the instructions on all of them. |
28 * | 28 * |
29 * If the tool is executed with a UID of 0 or with admin privileges under | |
30 * windows it will not look into the user directories but instead try | |
31 * to write the system wide defaults. | |
32 * | |
29 * If there are other processes accessing the databases the caller | 33 * If there are other processes accessing the databases the caller |
30 * has to ensure that those are terminated before this process is | 34 * has to ensure that those are terminated before this process is |
31 * executed. | 35 * executed. |
32 * | 36 * |
33 * If the same certificate is marked to be installed and to be removed | 37 * If the same certificate is marked to be installed and to be removed |
42 * with the profile name that it modified. | 46 * with the profile name that it modified. |
43 * | 47 * |
44 */ | 48 */ |
45 | 49 |
46 /** | 50 /** |
47 * @brief Needs to eb defined to get strnlen() | 51 * @brief Needs to be defined to get strnlen() |
48 */ | 52 */ |
49 #define _POSIX_C_SOURCE 200809L | 53 #define _POSIX_C_SOURCE 200809L |
50 | 54 |
51 /* REMOVEME: */ | 55 /* REMOVEME: */ |
52 #include <unistd.h> | 56 #include <unistd.h> |
69 #include "certhelp.h" | 73 #include "certhelp.h" |
70 #include "errorcodes.h" | 74 #include "errorcodes.h" |
71 #include "portpath.h" | 75 #include "portpath.h" |
72 #include "strhelp.h" | 76 #include "strhelp.h" |
73 #include "nss-secitemlist.h" | 77 #include "nss-secitemlist.h" |
78 #include "util.h" | |
74 | 79 |
75 #ifndef _WIN32 | 80 #ifndef _WIN32 |
76 #define CONFDIRS ".mozilla", ".thunderbird" | 81 #define CONFDIRS ".mozilla", ".thunderbird" |
82 /* Default installation directory of ubuntu 14.4 is respected */ | |
83 #define MOZILLA_DEFAULTS "/etc/thunderbird", "/etc/firefox" | |
77 #define NSSSHARED ".pki/nssdb" | 84 #define NSSSHARED ".pki/nssdb" |
85 #define NSSSHARED_GLOBAL "/etc/pki/nssdb" | |
78 #define TARGET_LINUX 1 | 86 #define TARGET_LINUX 1 |
79 #else | 87 #else |
88 #define MOZILLA_DEFAULTS 0 | |
80 #define CONFDIRS "Mozilla", "Thunderbird" | 89 #define CONFDIRS "Mozilla", "Thunderbird" |
81 #define NSSSHARED "" | 90 #define NSSSHARED "" |
82 #define TARGET_LINUX 0 | 91 #define TARGET_LINUX 0 |
83 #endif | 92 #endif |
84 | 93 |
197 if (str_equal(key, "Path")) | 206 if (str_equal(key, "Path")) |
198 { | 207 { |
199 if (relative_path) | 208 if (relative_path) |
200 xasprintf(&path, "%s/%s", inifile_dirname, value); | 209 xasprintf(&path, "%s/%s", inifile_dirname, value); |
201 else | 210 else |
202 xasprintf(&path, "%s", value); /* FIXME: LOOKS STUPID! */ | 211 xasprintf(&path, "%s", value); |
203 if ((fqpath = port_realpath(path)) != NULL) | 212 if ((fqpath = port_realpath(path)) != NULL) |
204 { | 213 { |
205 DEBUGPRINTF("Found profile path: '%s'\n", fqpath); | 214 DEBUGPRINTF("Found profile path: '%s'\n", fqpath); |
206 strv_append(&dirs, fqpath, strlen(fqpath)); | 215 strv_append(&dirs, fqpath, strlen(fqpath)); |
207 free (fqpath); | 216 free (fqpath); |
292 } | 301 } |
293 return inis; | 302 return inis; |
294 } | 303 } |
295 | 304 |
296 /** | 305 /** |
306 * @brief Collect the default profile directories for mozilla software | |
307 * | |
308 * If the default directory is found but not the profiles subdirectory | |
309 * this will create the profiles subdirectory. | |
310 * | |
311 * @return NULL terminated array of strings containing the absolute path | |
312 * to the default profile directories. Needs to be freed by the caller. | |
313 */ | |
314 static char** | |
315 get_default_profile_dirs() | |
316 { | |
317 char **retval = NULL; | |
318 | |
319 const char *confdirs[] = { MOZILLA_DEFAULTS, NULL }; | |
320 | |
321 for (int i=0; confdirs[i] != NULL; i++) | |
322 { | |
323 char * realpath = port_realpath(confdirs[i]); | |
324 char * profile_dir = NULL; | |
325 if (realpath == NULL) | |
326 { | |
327 DEBUGPRINTF ("Did not find directory: '%s'\n", confdirs[i]); | |
328 continue; | |
329 } | |
330 xasprintf(&profile_dir, "%s/profile", realpath); | |
331 if (port_isdir(profile_dir)) | |
332 { | |
333 DEBUGPRINTF("Found default directory: '%s'\n", profile_dir); | |
334 /* All is well */ | |
335 strv_append (&retval, profile_dir, strlen(profile_dir)); | |
336 xfree(profile_dir); | |
337 profile_dir = NULL; | |
338 continue; | |
339 } | |
340 else | |
341 { | |
342 /* Create the directory */ | |
343 if (port_fileexits(profile_dir)) | |
344 { | |
345 DEBUGPRINTF ("Path: '%s' is not a directory but it exists. Skipping.\n", | |
346 profile_dir); | |
347 xfree(profile_dir); | |
348 profile_dir = NULL; | |
349 continue; | |
350 } | |
351 else | |
352 { | |
353 /* Lets create it */ | |
354 if (!port_mkdir(profile_dir)) | |
355 { | |
356 ERRORPRINTF ("Failed to create directory: '%s'\n", profile_dir); | |
357 xfree(profile_dir); | |
358 profile_dir = NULL; | |
359 continue; | |
360 } | |
361 strv_append (&retval, profile_dir, strlen(profile_dir)); | |
362 xfree(profile_dir); | |
363 profile_dir = NULL; | |
364 } | |
365 } | |
366 } | |
367 return retval; | |
368 } | |
369 | |
370 /** | |
297 * @brief Collect all mozilla profile directories of current user. | 371 * @brief Collect all mozilla profile directories of current user. |
298 * @return NULL terminated array of strings containing the absolute | 372 * @return NULL terminated array of strings containing the absolute |
299 * path of the profile directories. The array needs to be freed by the | 373 * path of the profile directories. The array needs to be freed by the |
300 * caller. | 374 * caller. |
301 */ | 375 */ |
302 static char** | 376 static char** |
303 get_all_nssdb_dirs() | 377 get_all_nssdb_dirs() |
304 { | 378 { |
305 char **mozinis, **pdirs; | 379 char **mozinis, **pdirs; |
306 char **alldirs = NULL; | 380 char **alldirs = NULL; |
381 | |
382 if (is_elevated()) | |
383 { | |
384 #ifndef _WIN32 | |
385 /* NSS Shared db does not exist under windows. */ | |
386 strv_append(&alldirs, NSSSHARED_GLOBAL, strlen(NSSSHARED_GLOBAL)); | |
387 #endif | |
388 pdirs = get_default_profile_dirs(); | |
389 if (pdirs != NULL) | |
390 { | |
391 for (int i=0; pdirs[i] != NULL; i++) | |
392 { | |
393 strv_append(&alldirs, pdirs[i], strlen(pdirs[i])); | |
394 } | |
395 strv_free(pdirs); | |
396 } | |
397 return alldirs; | |
398 } | |
307 /* Search Mozilla/Firefox/Thunderbird profiles */ | 399 /* Search Mozilla/Firefox/Thunderbird profiles */ |
308 if ((mozinis = get_profile_inis()) != NULL) | 400 if ((mozinis = get_profile_inis()) != NULL) |
309 { | 401 { |
310 for (int i=0; mozinis[i] != NULL; i++) | 402 for (int i=0; mozinis[i] != NULL; i++) |
311 { | 403 { |
361 { | 453 { |
362 name = node->appData; | 454 name = node->appData; |
363 | 455 |
364 DEBUGPRINTF("Found certificate \"%s\"\n", name); | 456 DEBUGPRINTF("Found certificate \"%s\"\n", name); |
365 } | 457 } |
458 /* According to valgrind this leaks memory in the list. | |
459 We could not find API documentation to better free this | |
460 so we accept the leakage here in case of debug. */ | |
366 CERT_DestroyCertList(list); | 461 CERT_DestroyCertList(list); |
367 NSS_Shutdown(); | 462 NSS_Shutdown(); |
368 } | 463 } |
369 else | 464 else |
370 { | 465 { |