| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #include <plarena.h> |
| #include <prerror.h> |
| #include <prio.h> |
| #include <prprf.h> |
| #include <seccomon.h> |
| #include <secmod.h> |
| #include <jar.h> |
| #include <secutil.h> |
| |
| /* These are installation functions that make calls to the security library. |
| * We don't want to include security include files in the C++ code too much. |
| */ |
| |
| static char *PR_fgets(char *buf, int size, PRFileDesc *file); |
| |
| /*************************************************************************** |
| * |
| * P k 1 1 I n s t a l l _ A d d N e w M o d u l e |
| */ |
| int |
| Pk11Install_AddNewModule(char *moduleName, char *dllPath, |
| unsigned long defaultMechanismFlags, |
| unsigned long cipherEnableFlags) |
| { |
| return (SECMOD_AddNewModule(moduleName, dllPath, |
| SECMOD_PubMechFlagstoInternal(defaultMechanismFlags), |
| SECMOD_PubCipherFlagstoInternal(cipherEnableFlags)) == SECSuccess) |
| ? 0 |
| : -1; |
| } |
| |
| /************************************************************************* |
| * |
| * P k 1 1 I n s t a l l _ U s e r V e r i f y J a r |
| * |
| * Gives the user feedback on the signatures of a JAR files, asks them |
| * whether they actually want to continue. |
| * Assumes the jar structure has already been created and is valid. |
| * Returns 0 if the user wants to continue the installation, nonzero |
| * if the user wishes to abort. |
| */ |
| short |
| Pk11Install_UserVerifyJar(JAR *jar, PRFileDesc *out, PRBool query) |
| { |
| JAR_Context *ctx; |
| JAR_Cert *fing; |
| JAR_Item *item; |
| char stdinbuf[80]; |
| int count = 0; |
| |
| CERTCertificate *cert, *prev = NULL; |
| |
| PR_fprintf(out, "\nThis installation JAR file was signed by:\n"); |
| |
| ctx = JAR_find(jar, NULL, jarTypeSign); |
| |
| while (JAR_find_next(ctx, &item) >= 0) { |
| fing = (JAR_Cert *)item->data; |
| cert = fing->cert; |
| if (cert == prev) { |
| continue; |
| } |
| |
| count++; |
| PR_fprintf(out, "----------------------------------------------\n"); |
| if (cert) { |
| if (cert->nickname) { |
| PR_fprintf(out, "**NICKNAME**\n%s\n", cert->nickname); |
| } |
| if (cert->subjectName) { |
| PR_fprintf(out, "**SUBJECT NAME**\n%s\n", cert->subjectName); |
| } |
| if (cert->issuerName) { |
| PR_fprintf(out, "**ISSUER NAME**\n%s\n", cert->issuerName); |
| } |
| } else { |
| PR_fprintf(out, "No matching certificate could be found.\n"); |
| } |
| PR_fprintf(out, "----------------------------------------------\n\n"); |
| |
| prev = cert; |
| } |
| |
| JAR_find_end(ctx); |
| |
| if (count == 0) { |
| PR_fprintf(out, "No signatures found: JAR FILE IS UNSIGNED.\n"); |
| } |
| |
| if (query) { |
| PR_fprintf(out, |
| "Do you wish to continue this installation? (y/n) "); |
| |
| if (PR_fgets(stdinbuf, 80, PR_STDIN) != NULL) { |
| char *response; |
| |
| if ((response = strtok(stdinbuf, " \t\n\r"))) { |
| if (!PL_strcasecmp(response, "y") || |
| !PL_strcasecmp(response, "yes")) { |
| return 0; |
| } |
| } |
| } |
| } |
| |
| return 1; |
| } |
| |
| /************************************************************************** |
| * |
| * P R _ f g e t s |
| * |
| * fgets implemented with NSPR. |
| */ |
| static char * |
| PR_fgets(char *buf, int size, PRFileDesc *file) |
| { |
| int i; |
| int status; |
| char c; |
| |
| i = 0; |
| while (i < size - 1) { |
| status = PR_Read(file, (void *)&c, 1); |
| if (status == -1) { |
| return NULL; |
| } else if (status == 0) { |
| break; |
| } |
| buf[i++] = c; |
| if (c == '\n') { |
| break; |
| } |
| } |
| buf[i] = '\0'; |
| |
| return buf; |
| } |
| |
| /************************************************************************** |
| * |
| * m y S E C U _ E r r o r S t r i n g |
| * |
| */ |
| const char * |
| mySECU_ErrorString(PRErrorCode errnum) |
| { |
| return SECU_Strerror(errnum); |
| } |