advisor.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,020 行 · 第 1/5 页
C
2,020 行
rv = (SSMStatus) SSM_CreateResource(SSM_RESTYPE_PKCS12_CONTEXT, (void*)&p12Create, SSMRESOURCE(res)->m_connection, &rid, (SSMResource **)(&p12Cxt)); if (rv != PR_SUCCESS) { goto done; } /* pass along Advisor's client context for window management */ /* pass along Advisor's client context for window management */ SSM_CopyCMTItem(&((SSMResource *)p12Cxt)->m_clientContext, &((SSMResource *)res)->m_clientContext); rv = SSMPKCS12Context_RestoreCertFromPKCS12File(p12Cxt); if (rv == SSM_ERR_NEW_DEF_MAIL_CERT) { SSM_ChangeCertSecAdvisorList(req, NULL, certHashAdd); rv = SSMSecurityAdvisorContext_DoNewDefMailReponse(p12Cxt,req); } else { if (p12Cxt->super.m_buttonType == SSM_BUTTON_CANCEL){ rv = SSM_SUCCESS; SSM_HTTPReportError(req, HTTP_NO_CONTENT); } else if (rv != SSM_SUCCESS) { responseKey = SSMUI_GetPKCS12Error(rv, PR_FALSE); } else { responseKey = "pkcs12_restore_success"; SSM_ChangeCertSecAdvisorList(req, NULL, certHashAdd); } rv = SSMSecurityAdvisorContext_DoPKCS12Response(res, req, responseKey); } done: if (p12Cxt != NULL) { SSM_FreeResource(SSMRESOURCE(p12Cxt)); } return rv;}static CERTCertificate*SSMSecurityAdvisorContext_FindCertByNickname(SSMSecurityAdvisorContext *cx, HTTPRequest *req, char *certNickname){ CERTCertList *certList = NULL; CERTCertificate *cert = NULL; CERTCertListNode *certListNode = NULL; PRInt32 numcerts = 0; SSMTextGenContext *textGenCx = NULL; SSMStatus rv; char *htmlTemplate = NULL; certList = CERT_NewCertList(); certList = CERT_CreateNicknameCertList(certList, cx->super.m_connection->m_certdb, certNickname, PR_Now(), PR_FALSE); if (certList == NULL) { certList = PK11_FindCertsFromNickname(certNickname, &cx->super); if (certList == NULL) { SSM_DEBUG("Could not find a certificate with nick '%s' " "in cert database\n", certNickname); goto loser; } } certListNode = CERT_LIST_HEAD(certList); while (!CERT_LIST_END(certListNode, certList)) { numcerts++; certListNode = CERT_LIST_NEXT(certListNode); } if (numcerts > 1) { char * formName = NULL, *params = NULL; rv = SSM_HTTPParamValue(req, "formName", &formName); if (rv != SSM_SUCCESS || !formName) SSM_DEBUG("AdvisorContext_FindCertByNickname:Can't get original form\n"); params = PR_smprintf("origin=%s",formName); cx->m_nickname = PL_strdup(certNickname); rv = SSMControlConnection_SendUIEvent(cx->super.m_connection, "get", "choose_cert", &cx->super, params, &cx->super.m_clientContext, PR_TRUE); /* Now wait until we are notified by the handler that the user * has selected a cert. */ SSM_LockUIEvent(&cx->super); SSM_WaitUIEvent(&cx->super, PR_INTERVAL_NO_TIMEOUT); cert = (CERTCertificate*)cx->super.m_connection->super.super.m_uiData; if (cx->super.m_buttonType != SSM_BUTTON_CANCEL) { /* * If we don't sleep for a bit here, we cause Communicator to crash * because it tries to re-use a Window that gets killed. Guess * we're just too fast for Communicator. */ PR_Sleep(PR_TicksPerSecond()*1); } PR_FREEIF(cx->m_nickname); cx->m_nickname = NULL; PR_FREEIF(params); } else { cert = CERT_FindCertByNickname(cx->super.m_connection->m_certdb, certNickname); cx->super.m_buttonType = SSM_BUTTON_OK; } CERT_DestroyCertList(certList); return cert; loser: PR_FREEIF(htmlTemplate); if (certList != NULL) { CERT_DestroyCertList(certList); } if (cert != NULL) { CERT_DestroyCertificate(cert); } if (textGenCx != NULL) { SSMTextGen_DestroyContext(textGenCx); } return NULL;}typedef struct SSMFindMineArgStr { CERTCertList *certList; SSMControlConnection *ctrl;} SSMFindMineArg;static SSMStatusssm_find_all_mine(PRIntn index, void *arg, void *key, void *itemdata){ ssmCertData * data = (ssmCertData*)itemdata; SSMFindMineArg *findArg = (SSMFindMineArg*) arg; char *nick = (char*)key; SSMStatus rv = SSM_FAILURE; if (data->usage == clAllMine) { CERTCertList *tmpList; tmpList = CERT_CreateNicknameCertList(findArg->certList, findArg->ctrl->m_certdb, nick, PR_Now(), PR_FALSE); if (tmpList != NULL) { rv = SSM_SUCCESS; } } return rv;}SSMStatusSSMSecurityAdvisorContext_BackupAllMineCerts(SSMSecurityAdvisorContext *cx, HTTPRequest *req){ SSMFindMineArg arg; CERTCertList *certList=NULL; SSMPKCS12Context *p12Cxt=NULL; SSMPKCS12CreateArg p12Create; SSMResourceID rid; SSMStatus rv; CERTCertificate **certArr = NULL; int numCerts,i, finalCerts, currIndex; CERTCertListNode *node; PRIntn numNicks; const char *responseKey; certList = CERT_NewCertList(); if (certList == NULL) { goto loser; } arg.certList = certList; arg.ctrl = req->ctrlconn; numNicks = SSMSortedList_Enumerate(cx->m_certhash, ssm_find_all_mine, &arg); if (numNicks <= 0){ /* No certs to backup */ SSM_HTTPReportError(req, HTTP_NO_CONTENT); goto loser; } certList = arg.certList; p12Create.isExportContext = PR_TRUE; rv = (SSMStatus) SSM_CreateResource(SSM_RESTYPE_PKCS12_CONTEXT, (void*)&p12Create, req->ctrlconn, &rid, (SSMResource**)(&p12Cxt)); if (rv != SSM_SUCCESS) { goto loser; } SSM_CopyCMTItem(&p12Cxt->super.m_clientContext, &cx->super.m_clientContext); numCerts = SSM_CertListCount(certList); certArr = SSM_NEW_ARRAY(CERTCertificate*,numCerts); if (certArr == NULL) { goto loser; } node = CERT_LIST_HEAD(certList); for (i=0, currIndex=0, finalCerts=numCerts; i<numCerts; i++) { if (node->cert->slot == NULL || PK11_IsInternal(node->cert->slot)) { certArr[currIndex] = node->cert; currIndex++; } else { finalCerts--; } node = CERT_LIST_NEXT(node); } rv = SSMPKCS12Context_CreatePKCS12FileForMultipleCerts(p12Cxt, PR_TRUE, certArr, finalCerts); PR_Free(certArr); certArr = NULL; CERT_DestroyCertList(certList); certList = NULL; if (rv == SSM_SUCCESS) { responseKey = (finalCerts > 1) ? "pkcs12_backup_multiple_success" : "pkcs12_backup_success"; } else { if (p12Cxt->super.m_buttonType == SSM_BUTTON_CANCEL) { goto loser; } else { responseKey = SSMUI_GetPKCS12Error(rv, PR_TRUE); } } SSM_FreeResource(&p12Cxt->super); p12Cxt = NULL; if (SSMSecurityAdvisorContext_DoPKCS12Response(cx, req, responseKey) != SSM_SUCCESS) { goto loser; } return SSM_SUCCESS; loser: PR_FREEIF(certArr); if (certList != NULL) { CERT_DestroyCertList(certList); } if (p12Cxt != NULL) { SSM_FreeResource(&p12Cxt->super); } SSM_HTTPReportError(req, HTTP_NO_CONTENT); return SSM_FAILURE;}SSMStatus SSMSecurityAdvisorContext_DoPKCS12Backup( SSMSecurityAdvisorContext *cx, HTTPRequest *req){ SSMStatus rv; char *certNickname; const char *responseKey; SSMPKCS12CreateArg p12Create; SSMResourceID rid; SSMPKCS12Context *p12Cxt; p12Create.isExportContext = PR_TRUE; rv = (SSMStatus) SSM_CreateResource(SSM_RESTYPE_PKCS12_CONTEXT, (void*)&p12Create, SSMRESOURCE(cx)->m_connection, &rid, (SSMResource **)(&p12Cxt)); if (rv != PR_SUCCESS) { goto loser; } /* pass along Advisor's client context for window management */ SSM_CopyCMTItem(&((SSMResource *)p12Cxt)->m_clientContext, &((SSMResource *)cx)->m_clientContext); rv = SSM_HTTPParamValue(req, "selectCert", &certNickname); if (rv != SSM_SUCCESS) { goto loser; } p12Cxt->m_cert = SSMSecurityAdvisorContext_FindCertByNickname(cx, req, certNickname); if (cx->super.m_buttonType == SSM_BUTTON_CANCEL) { goto loser; } if (p12Cxt->m_cert == NULL) { goto loser; } /* p12Cxt->super.m_clientContext = cx->super.m_clientContext; */ rv = SSMPKCS12Context_CreatePKCS12File(p12Cxt, PR_TRUE); if (rv == SSM_SUCCESS) { responseKey = "pkcs12_backup_success"; } else { if (p12Cxt->super.m_buttonType == SSM_BUTTON_CANCEL) { goto loser; } else { responseKey = SSMUI_GetPKCS12Error(rv, PR_TRUE); } } if (SSMSecurityAdvisorContext_DoPKCS12Response(cx, req, responseKey) != SSM_SUCCESS) { goto loser; } SSM_FreeResource(&p12Cxt->super); return SSM_SUCCESS; loser: if (p12Cxt != NULL) { SSM_FreeResource(&p12Cxt->super); } SSM_HTTPReportError(req, HTTP_NO_CONTENT); return SSM_FAILURE;}char *ssm_packb64_name(char *b64Name){ char *htmlString = NULL; int numPercentSigns = 0; char *cursor, *retString; int i, newLen, origHTMLStrLen; htmlString = SSM_ConvertStringToHTMLString(b64Name); /* * Now let's see if there are any '%' characters that need * to be escaped so that printf statements succeed. */ cursor = htmlString; while ((cursor = PL_strchr(cursor, '%')) != NULL) { numPercentSigns++; cursor++; } if (numPercentSigns == 0) { htmlString; } origHTMLStrLen = PL_strlen(htmlString); newLen = origHTMLStrLen + numPercentSigns + 1; retString = SSM_NEW_ARRAY(char, newLen); for (i=0,cursor=retString; i<origHTMLStrLen+1; i++,cursor++) { if (htmlString[i] == '%') { char *dollarSign, *placeHolder; /* * Let's see if this a urlencoded escape or a printf parameter. */ placeHolder = &htmlString[i]; dollarSign = PL_strchr(placeHolder, '$'); if (dollarSign && ((dollarSign - placeHolder) < 2)) { /* * OK, this is a numbered parameter for printf */ *cursor = htmlString[i]; } else { /* * This is an escape for url encoding. Escape it so printf * doesn't blow up. */ *cursor = '%'; cursor++; *cursor = '%'; } } else { *cursor = htmlString[i]; } } PR_Free(htmlString); return retString;}SSMStatusSSMSecurityAdvisorContext_ProcessCRLDialog (HTTPRequest *req){ SSMHTTPParamMultValues crlNames={NULL, NULL, 0}; CERTSignedCrl *realCrl; SECItem crlDERName; PRBool flushSSLCache = PR_FALSE; SSMStatus rv; SECStatus srv; int i, type; rv = SSM_HTTPParamValueMultiple(req, "crlNames", &crlNames); if (rv != SSM_SUCCESS || crlNames.numValues == 0) { goto loser; } memset (&crlDERName, 0, sizeof(SECItem)); for (i=0; i<crlNames.numValues; i++) { /* * The first character in the value string represents the type, * either 1 (SEC_CRL_TYPE) or 0 (SEC_KRL_TYPE) */ srv = ATOB_ConvertAsciiToItem(&crlDERName, crlNames.values[i]+1); if (srv != SECSuccess) { goto loser; } type = (crlNames.values[i][0] == '1') ? SEC_CRL_TYPE : SEC_KRL_TYPE; realCrl = SEC_FindCrlByName(req->ctrlconn->m_certdb, &crlDERName, type); SECITEM_FreeItem(&crlDERName, PR_FALSE); if (realCrl) { SEC_DeletePermCRL(realCrl); SEC_DestroyCrl(realCrl); flushSSLCache = PR_TRUE; } } if (flushSSLCache) { SSL_ClearSessionCache(); } if (!SSM_IsCRLPresent(req->ctrlconn)) { /* * In this case, there are no more CRLs in the database, * so we'll replace the baseRef with one that will cause * the security advisor to refresh itself and elminate the * "Delete CRLs" button. */ for (i=0; i<req->numParams; i++) { char *crlCloseKey = "crlclose_doclose_js";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?