SECStatus LoadLoadableRoots(/*optional*/ const char* dir, const char* modNameUTF8) { PR_ASSERT(modNameUTF8); if (!modNameUTF8) { PR_SetError(SEC_ERROR_INVALID_ARGS, 0); return SECFailure; } ScopedPtr<char, PR_FreeLibraryName> fullLibraryPath( PR_GetLibraryName(dir, "nssckbi")); if (!fullLibraryPath) { return SECFailure; } ScopedPtr<char, PORT_Free_string> escaped_fullLibraryPath( nss_addEscape(fullLibraryPath.get(), '\"')); if (!escaped_fullLibraryPath) { return SECFailure; } // If a module exists with the same name, delete it. int modType; SECMOD_DeleteModule(modNameUTF8, &modType); ScopedPtr<char, PR_smprintf_free> pkcs11ModuleSpec( PR_smprintf("name=\"%s\" library=\"%s\"", modNameUTF8, escaped_fullLibraryPath.get())); if (!pkcs11ModuleSpec) { return SECFailure; } ScopedSECMODModule rootsModule(SECMOD_LoadUserModule(pkcs11ModuleSpec.get(), nullptr, false)); if (!rootsModule) { return SECFailure; } if (!rootsModule->loaded) { PR_SetError(PR_INVALID_STATE_ERROR, 0); return SECFailure; } return SECSuccess; }
/*********************************************************************** * * D e l e t e M o d u l e * * Deletes the named module from the database. */ Error DeleteModule(char *moduleName) { SECStatus status; int type; status = SECMOD_DeleteModule(moduleName, &type); if (status != SECSuccess) { if (type == SECMOD_FIPS || type == SECMOD_INTERNAL) { PR_fprintf(PR_STDERR, errStrings[DELETE_INTERNAL_ERR]); return DELETE_INTERNAL_ERR; } else { PR_fprintf(PR_STDERR, errStrings[DELETE_FAILED_ERR], moduleName); return DELETE_FAILED_ERR; } } PR_fprintf(PR_STDOUT, msgStrings[DELETE_SUCCESS_MSG], moduleName); return SUCCESS; }
// Delete a PKCS11 module from the user's profile. NS_IMETHODIMP nsPkcs11::DeleteModule(const nsAString& aModuleName) { nsNSSShutDownPreventionLock locker; if (isAlreadyShutDown()) { return NS_ERROR_NOT_AVAILABLE; } if (aModuleName.IsEmpty()) { return NS_ERROR_INVALID_ARG; } NS_ConvertUTF16toUTF8 moduleName(aModuleName); // Introduce additional scope for module so all references to it are released // before we call SECMOD_DeleteModule, below. #ifndef MOZ_NO_SMART_CARDS { mozilla::UniqueSECMODModule module(SECMOD_FindModule(moduleName.get())); if (!module) { return NS_ERROR_FAILURE; } nsCOMPtr<nsINSSComponent> nssComponent( do_GetService(PSM_COMPONENT_CONTRACTID)); nssComponent->ShutdownSmartCardThread(module.get()); } #endif // modType is an output variable. We ignore it. int32_t modType; SECStatus srv = SECMOD_DeleteModule(moduleName.get(), &modType); if (srv != SECSuccess) { return NS_ERROR_FAILURE; } return NS_OK; }