Index: mozilla/security/nss/lib/util/utilmod.c |
=================================================================== |
--- mozilla/security/nss/lib/util/utilmod.c (revision 166571) |
+++ mozilla/security/nss/lib/util/utilmod.c (working copy) |
@@ -17,16 +17,15 @@ |
* |
* |
*/ |
-#include "sftkdb.h" |
-#include "sftkpars.h" |
#include "prprf.h" |
#include "prsystem.h" |
#include "lgglue.h" |
-#include "secerr.h" |
-#include "secmodt.h" |
+/*#include "secmodt.h" */ |
#if defined (_WIN32) |
#include <io.h> |
#endif |
+#include "utilpars.h" |
+#include "secerr.h" |
/**************************************************************** |
* |
@@ -47,37 +46,7 @@ |
* name="My other PKCS#11 module" |
*/ |
-static char * |
-sftkdb_quote(const char *string, char quote) |
-{ |
- char *newString = 0; |
- int escapes = 0, size = 0; |
- const char *src; |
- char *dest; |
- size=2; |
- for (src=string; *src ; src++) { |
- if ((*src == quote) || (*src == '\\')) escapes++; |
- size++; |
- } |
- |
- dest = newString = PORT_ZAlloc(escapes+size+1); |
- if (newString == NULL) { |
- return NULL; |
- } |
- |
- *dest++=quote; |
- for (src=string; *src; src++,dest++) { |
- if ((*src == '\\') || (*src == quote)) { |
- *dest++ = '\\'; |
- } |
- *dest = *src; |
- } |
- *dest=quote; |
- |
- return newString; |
-} |
- |
/* |
* Smart string cat functions. Automatically manage the memory. |
* The first parameter is the source string. If it's null, we |
@@ -85,7 +54,7 @@ |
* so the the concanenated string fits. |
*/ |
static char * |
-sftkdb_DupnCat(char *baseString, const char *str, int str_len) |
+nssutil_DupnCat(char *baseString, const char *str, int str_len) |
{ |
int len = (baseString ? PORT_Strlen(baseString) : 0) + 1; |
char *newString; |
@@ -100,18 +69,18 @@ |
return PORT_Strncat(newString,str, str_len); |
} |
-/* Same as sftkdb_DupnCat except it concatenates the full string, not a |
+/* Same as nssutil_DupnCat except it concatenates the full string, not a |
* partial one */ |
static char * |
-sftkdb_DupCat(char *baseString, const char *str) |
+nssutil_DupCat(char *baseString, const char *str) |
{ |
- return sftkdb_DupnCat(baseString, str, PORT_Strlen(str)); |
+ return nssutil_DupnCat(baseString, str, PORT_Strlen(str)); |
} |
/* function to free up all the memory associated with a null terminated |
* array of module specs */ |
static SECStatus |
-sftkdb_releaseSpecList(char **moduleSpecList) |
+nssutil_releaseSpecList(char **moduleSpecList) |
{ |
if (moduleSpecList) { |
char **index; |
@@ -125,7 +94,7 @@ |
#define SECMOD_STEP 10 |
static SECStatus |
-sftkdb_growList(char ***pModuleList, int *useCount, int last) |
+nssutil_growList(char ***pModuleList, int *useCount, int last) |
{ |
char **newModuleList; |
@@ -141,29 +110,30 @@ |
} |
static |
-char *sftk_getOldSecmodName(const char *dbname,const char *filename) |
+char *_NSSUTIL_GetOldSecmodName(const char *dbname,const char *filename) |
{ |
char *file = NULL; |
char *dirPath = PORT_Strdup(dbname); |
char *sep; |
- sep = PORT_Strrchr(dirPath,*PATH_SEPARATOR); |
-#ifdef _WIN32 |
+ sep = PORT_Strrchr(dirPath,*NSSUTIL_PATH_SEPARATOR); |
+#ifdef WINDOWS |
if (!sep) { |
- /* pkcs11i.h defines PATH_SEPARATOR as "/" for all platforms. */ |
sep = PORT_Strrchr(dirPath,'\\'); |
} |
#endif |
if (sep) { |
- *sep = 0; |
- file = PR_smprintf("%s"PATH_SEPARATOR"%s", dirPath, filename); |
- } else { |
- file = PR_smprintf("%s", filename); |
+ *(sep)=0; |
} |
+ file= PR_smprintf("%s"NSSUTIL_PATH_SEPARATOR"%s", dirPath, filename); |
PORT_Free(dirPath); |
return file; |
} |
+static SECStatus nssutil_AddSecmodDB(NSSDBType dbType, const char *appName, |
+ const char *filename, const char *dbname, |
+ char *module, PRBool rw); |
+ |
#ifdef XP_UNIX |
#include <unistd.h> |
#endif |
@@ -191,15 +161,12 @@ |
#endif |
#define MAX_LINE_LENGTH 2048 |
-#define SFTK_DEFAULT_INTERNAL_INIT1 "library= name=\"NSS Internal PKCS #11 Module\" parameters=" |
-#define SFTK_DEFAULT_INTERNAL_INIT2 " NSS=\"Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={" |
-#define SFTK_DEFAULT_INTERNAL_INIT3 " askpw=any timeout=30})\"" |
/* |
* Read all the existing modules in out of the file. |
*/ |
-char ** |
-sftkdb_ReadSecmodDB(SDBType dbType, const char *appName, |
+static char ** |
+nssutil_ReadSecmodDB(NSSDBType dbType, const char *appName, |
const char *filename, const char *dbname, |
char *params, PRBool rw) |
{ |
@@ -214,18 +181,14 @@ |
char *paramsValue=NULL; |
PRBool failed = PR_TRUE; |
- if ((dbname != NULL) && |
- ((dbType == SDB_LEGACY) || (dbType == SDB_MULTIACCESS))) { |
- return sftkdbCall_ReadSecmodDB(appName, filename, dbname, params, rw); |
+ if (dbname == NULL) { |
+ PORT_SetError(SEC_ERROR_INVALID_ARGS); |
+ return NULL; |
} |
moduleList = (char **) PORT_ZAlloc(useCount*sizeof(char **)); |
if (moduleList == NULL) return NULL; |
- if (dbname == NULL) { |
- goto return_default; |
- } |
- |
/* do we really want to use streams here */ |
fd = fopen(dbname, "r"); |
if (fd == NULL) goto done; |
@@ -262,18 +225,18 @@ |
/* there is no value, write out the stanza as is */ |
if (value == NULL || value[1] == 0) { |
if (moduleString) { |
- moduleString = sftkdb_DupnCat(moduleString," ", 1); |
+ moduleString = nssutil_DupnCat(moduleString," ", 1); |
if (moduleString == NULL) goto loser; |
} |
- moduleString = sftkdb_DupCat(moduleString, line); |
+ moduleString = nssutil_DupCat(moduleString, line); |
if (moduleString == NULL) goto loser; |
/* value is already quoted, just write it out */ |
} else if (value[1] == '"') { |
if (moduleString) { |
- moduleString = sftkdb_DupnCat(moduleString," ", 1); |
+ moduleString = nssutil_DupnCat(moduleString," ", 1); |
if (moduleString == NULL) goto loser; |
} |
- moduleString = sftkdb_DupCat(moduleString, line); |
+ moduleString = nssutil_DupCat(moduleString, line); |
if (moduleString == NULL) goto loser; |
/* we have an override parameter section, remember that |
* we found this (see following comment about why this |
@@ -304,21 +267,21 @@ |
if (paramsValue) { |
continue; |
} |
- paramsValue = sftkdb_quote(&value[1], '"'); |
+ paramsValue = NSSUTIL_Quote(&value[1], '"'); |
if (paramsValue == NULL) goto loser; |
continue; |
} else { |
/* may need to quote */ |
char *newLine; |
if (moduleString) { |
- moduleString = sftkdb_DupnCat(moduleString," ", 1); |
+ moduleString = nssutil_DupnCat(moduleString," ", 1); |
if (moduleString == NULL) goto loser; |
} |
- moduleString = sftkdb_DupnCat(moduleString,line,value-line+1); |
+ moduleString = nssutil_DupnCat(moduleString,line,value-line+1); |
if (moduleString == NULL) goto loser; |
- newLine = sftkdb_quote(&value[1],'"'); |
+ newLine = NSSUTIL_Quote(&value[1],'"'); |
if (newLine == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString,newLine); |
+ moduleString = nssutil_DupCat(moduleString,newLine); |
PORT_Free(newLine); |
if (moduleString == NULL) goto loser; |
} |
@@ -333,7 +296,7 @@ |
if (paramsValue) { |
PORT_Free(paramsValue); |
} |
- paramsValue = sftkdb_quote(params, '"'); |
+ paramsValue = NSSUTIL_Quote(params, '"'); |
} |
} |
continue; |
@@ -349,9 +312,9 @@ |
if (paramsValue) { |
/* we had an override */ |
if (!skipParams) { |
- moduleString = sftkdb_DupnCat(moduleString," parameters=", 12); |
+ moduleString = nssutil_DupnCat(moduleString," parameters=", 12); |
if (moduleString == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString, paramsValue); |
+ moduleString = nssutil_DupCat(moduleString, paramsValue); |
if (moduleString == NULL) goto loser; |
} |
PORT_Free(paramsValue); |
@@ -360,7 +323,7 @@ |
if ((moduleCount+1) >= useCount) { |
SECStatus rv; |
- rv = sftkdb_growList(&moduleList, &useCount, moduleCount+1); |
+ rv = nssutil_growList(&moduleList, &useCount, moduleCount+1); |
if (rv != SECSuccess) { |
goto loser; |
} |
@@ -382,16 +345,10 @@ |
moduleString = NULL; |
} |
done: |
- /* If we couldn't open a pkcs11 database, look for the old one. |
- * This is necessary to maintain the semantics of the transition from |
- * old to new DB's. If there is an old DB and not new DB, we will |
- * automatically use the old DB. If the DB was opened read/write, we |
- * create a new db and upgrade it from the old one. */ |
+ /* if we couldn't open a pkcs11 database, look for the old one */ |
if (fd == NULL) { |
- char *olddbname = sftk_getOldSecmodName(dbname,filename); |
+ char *olddbname = _NSSUTIL_GetOldSecmodName(dbname,filename); |
PRStatus status; |
- char **oldModuleList; |
- int i; |
/* couldn't get the old name */ |
if (!olddbname) { |
@@ -400,65 +357,34 @@ |
/* old one doesn't exist */ |
status = PR_Access(olddbname, PR_ACCESS_EXISTS); |
- if (status != PR_SUCCESS) { |
- goto bail; |
+ if (status == PR_SUCCESS) { |
+ PR_smprintf_free(olddbname); |
+ PORT_SetError(SEC_ERROR_LEGACY_DATABASE); |
+ return NULL; |
} |
- oldModuleList = sftkdbCall_ReadSecmodDB(appName, filename, |
- olddbname, params, rw); |
- /* old one had no modules */ |
- if (!oldModuleList) { |
- goto bail; |
- } |
- |
- /* count the modules */ |
- for (i=0; oldModuleList[i]; i++) { } |
- |
- /* grow the moduleList if necessary */ |
- if (i >= useCount) { |
- SECStatus rv; |
- rv = sftkdb_growList(&moduleList,&useCount,moduleCount+1); |
- if (rv != SECSuccess) { |
- goto loser; |
- } |
- } |
- |
- /* write each module out, and copy it */ |
- for (i=0; oldModuleList[i]; i++) { |
- if (rw) { |
- sftkdb_AddSecmodDB(dbType,appName,filename,dbname, |
- oldModuleList[i],rw); |
- } |
- if (moduleList[i]) { |
- PORT_Free(moduleList[i]); |
- } |
- moduleList[i] = PORT_Strdup(oldModuleList[i]); |
- } |
- |
- /* done with the old module list */ |
- sftkdbCall_ReleaseSecmodDBData(appName, filename, olddbname, |
- oldModuleList, rw); |
bail: |
if (olddbname) { |
PR_smprintf_free(olddbname); |
} |
} |
- |
-return_default: |
if (!moduleList[0]) { |
char * newParams; |
- moduleString = PORT_Strdup(SFTK_DEFAULT_INTERNAL_INIT1); |
- newParams = sftkdb_quote(params,'"'); |
+ moduleString = PORT_Strdup(NSSUTIL_DEFAULT_INTERNAL_INIT1); |
+ newParams = NSSUTIL_Quote(params,'"'); |
if (newParams == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString, newParams); |
+ moduleString = nssutil_DupCat(moduleString, newParams); |
PORT_Free(newParams); |
if (moduleString == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString, SFTK_DEFAULT_INTERNAL_INIT2); |
+ moduleString = nssutil_DupCat(moduleString, |
+ NSSUTIL_DEFAULT_INTERNAL_INIT2); |
if (moduleString == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString, SECMOD_SLOT_FLAGS); |
+ moduleString = nssutil_DupCat(moduleString, |
+ NSSUTIL_DEFAULT_SFTKN_FLAGS); |
if (moduleString == NULL) goto loser; |
- moduleString = sftkdb_DupCat(moduleString, SFTK_DEFAULT_INTERNAL_INIT3); |
+ moduleString = nssutil_DupCat(moduleString, |
+ NSSUTIL_DEFAULT_INTERNAL_INIT3); |
if (moduleString == NULL) goto loser; |
moduleList[0] = moduleString; |
moduleString = NULL; |
@@ -480,7 +406,7 @@ |
} |
if (failed || (moduleList[0] == NULL)) { |
/* This is wrong! FIXME */ |
- sftkdb_releaseSpecList(moduleList); |
+ nssutil_releaseSpecList(moduleList); |
moduleList = NULL; |
failed = PR_TRUE; |
} |
@@ -488,23 +414,18 @@ |
fclose(fd); |
} else if (!failed && rw) { |
/* update our internal module */ |
- sftkdb_AddSecmodDB(dbType,appName,filename,dbname,moduleList[0],rw); |
+ nssutil_AddSecmodDB(dbType,appName,filename,dbname,moduleList[0],rw); |
} |
return moduleList; |
} |
-SECStatus |
-sftkdb_ReleaseSecmodDBData(SDBType dbType, const char *appName, |
+static SECStatus |
+nssutil_ReleaseSecmodDBData(NSSDBType dbType, const char *appName, |
const char *filename, const char *dbname, |
char **moduleSpecList, PRBool rw) |
{ |
- if ((dbname != NULL) && |
- ((dbType == SDB_LEGACY) || (dbType == SDB_MULTIACCESS))) { |
- return sftkdbCall_ReleaseSecmodDBData(appName, filename, dbname, |
- moduleSpecList, rw); |
- } |
if (moduleSpecList) { |
- sftkdb_releaseSpecList(moduleSpecList); |
+ nssutil_releaseSpecList(moduleSpecList); |
} |
return SECSuccess; |
} |
@@ -513,8 +434,8 @@ |
/* |
* Delete a module from the Data Base |
*/ |
-SECStatus |
-sftkdb_DeleteSecmodDB(SDBType dbType, const char *appName, |
+static SECStatus |
+nssutil_DeleteSecmodDB(NSSDBType dbType, const char *appName, |
const char *filename, const char *dbname, |
char *args, PRBool rw) |
{ |
@@ -535,16 +456,12 @@ |
return SECFailure; |
} |
- if ((dbType == SDB_LEGACY) || (dbType == SDB_MULTIACCESS)) { |
- return sftkdbCall_DeleteSecmodDB(appName, filename, dbname, args, rw); |
- } |
- |
if (!rw) { |
PORT_SetError(SEC_ERROR_READ_ONLY); |
return SECFailure; |
} |
- dbname2 = strdup(dbname); |
+ dbname2 = PORT_Strdup(dbname); |
if (dbname2 == NULL) goto loser; |
dbname2[strlen(dbname)-1]++; |
@@ -558,11 +475,11 @@ |
#endif |
if (fd2 == NULL) goto loser; |
- name = sftk_argGetParamValue("name",args); |
+ name = NSSUTIL_ArgGetParamValue("name",args); |
if (name) { |
name_len = PORT_Strlen(name); |
} |
- lib = sftk_argGetParamValue("library",args); |
+ lib = NSSUTIL_ArgGetParamValue("library",args); |
if (lib) { |
lib_len = PORT_Strlen(lib); |
} |
@@ -599,7 +516,7 @@ |
continue; |
} |
/* not our match, continue to collect data in this block */ |
- block = sftkdb_DupCat(block,line); |
+ block = nssutil_DupCat(block,line); |
continue; |
} |
/* we've collected a block of data that wasn't the module we were |
@@ -650,8 +567,8 @@ |
/* |
* Add a module to the Data base |
*/ |
-SECStatus |
-sftkdb_AddSecmodDB(SDBType dbType, const char *appName, |
+static SECStatus |
+nssutil_AddSecmodDB(NSSDBType dbType, const char *appName, |
const char *filename, const char *dbname, |
char *module, PRBool rw) |
{ |
@@ -664,10 +581,6 @@ |
return SECFailure; |
} |
- if ((dbType == SDB_LEGACY) || (dbType == SDB_MULTIACCESS)) { |
- return sftkdbCall_AddSecmodDB(appName, filename, dbname, module, rw); |
- } |
- |
/* can't write to a read only module */ |
if (!rw) { |
PORT_SetError(SEC_ERROR_READ_ONLY); |
@@ -675,7 +588,8 @@ |
} |
/* remove the previous version if it exists */ |
- (void) sftkdb_DeleteSecmodDB(dbType, appName, filename, dbname, module, rw); |
+ (void) nssutil_DeleteSecmodDB(dbType, appName, filename, |
+ dbname, module, rw); |
#ifdef WINCE |
fd = fopen(dbname, "a+"); |
@@ -685,7 +599,7 @@ |
if (fd == NULL) { |
return SECFailure; |
} |
- module = sftk_argStrip(module); |
+ module = NSSUTIL_ArgStrip(module); |
while (*module) { |
int count; |
char *keyEnd = PORT_Strchr(module,'='); |
@@ -695,20 +609,20 @@ |
libFound=PR_TRUE; |
} |
if (keyEnd == NULL) { |
- block = sftkdb_DupCat(block, module); |
+ block = nssutil_DupCat(block, module); |
break; |
} |
- block = sftkdb_DupnCat(block, module, keyEnd-module+1); |
+ block = nssutil_DupnCat(block, module, keyEnd-module+1); |
if (block == NULL) { goto loser; } |
- value = sftk_argFetchValue(&keyEnd[1], &count); |
+ value = NSSUTIL_ArgFetchValue(&keyEnd[1], &count); |
if (value) { |
- block = sftkdb_DupCat(block, sftk_argStrip(value)); |
+ block = nssutil_DupCat(block, NSSUTIL_ArgStrip(value)); |
PORT_Free(value); |
} |
if (block == NULL) { goto loser; } |
- block = sftkdb_DupnCat(block, "\n", 1); |
+ block = nssutil_DupnCat(block, "\n", 1); |
module = keyEnd + 1 + count; |
- module = sftk_argStrip(module); |
+ module = NSSUTIL_ArgStrip(module); |
} |
if (block) { |
if (!libFound) { |
@@ -729,3 +643,49 @@ |
} |
+char ** |
+NSSUTIL_DoModuleDBFunction(unsigned long function,char *parameters, void *args) |
+{ |
+ char *secmod = NULL; |
+ char *appName = NULL; |
+ char *filename = NULL; |
+ NSSDBType dbType = NSS_DB_TYPE_NONE; |
+ PRBool rw; |
+ static char *success="Success"; |
+ char **rvstr = NULL; |
+ |
+ |
+ secmod = _NSSUTIL_GetSecmodName(parameters, &dbType, &appName, |
+ &filename, &rw); |
+ if ((dbType == NSS_DB_TYPE_LEGACY) || |
+ (dbType == NSS_DB_TYPE_MULTIACCESS)) { |
+ /* we can't handle the old database, only softoken can */ |
+ PORT_SetError(SEC_ERROR_LEGACY_DATABASE); |
+ rvstr = NULL; |
+ goto done; |
+ } |
+ |
+ switch (function) { |
+ case SECMOD_MODULE_DB_FUNCTION_FIND: |
+ rvstr = nssutil_ReadSecmodDB(dbType,appName,filename, |
+ secmod,(char *)parameters,rw); |
+ break; |
+ case SECMOD_MODULE_DB_FUNCTION_ADD: |
+ rvstr = (nssutil_AddSecmodDB(dbType,appName,filename, |
+ secmod,(char *)args,rw) == SECSuccess) ? &success: NULL; |
+ break; |
+ case SECMOD_MODULE_DB_FUNCTION_DEL: |
+ rvstr = (nssutil_DeleteSecmodDB(dbType,appName,filename, |
+ secmod,(char *)args,rw) == SECSuccess) ? &success: NULL; |
+ break; |
+ case SECMOD_MODULE_DB_FUNCTION_RELEASE: |
+ rvstr = (nssutil_ReleaseSecmodDBData(dbType, appName,filename, |
+ secmod, (char **)args,rw) == SECSuccess) ? &success: NULL; |
+ break; |
+ } |
+done: |
+ if (secmod) PR_smprintf_free(secmod); |
+ if (appName) PORT_Free(appName); |
+ if (filename) PORT_Free(filename); |
+ return rvstr; |
+} |