advisor.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,020 行 · 第 1/5 页
C
2,020 行
if (PL_strcmp(req->paramNames[i], "baseRef") == 0) { memcpy (req->paramValues[i], crlCloseKey, PL_strlen(crlCloseKey)+1); break; } } } if (SSM_HTTPDefaultCommandHandler(req) != SSM_SUCCESS) { goto loser; } PR_FREEIF(crlNames.values); return SSM_SUCCESS; loser: PR_FREEIF(crlNames.values); return SSM_FAILURE;}SSMStatus SSMSecurityAdvisorContext_Process_cert_mine_form( SSMSecurityAdvisorContext *res, HTTPRequest *req){ SSMStatus rv= SSM_FAILURE; char *button; /* Figure out which one of the buttons on the form was pressed. */ if (SSM_HTTPParamValue(req, "backup", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSMSecurityAdvisorContext_DoPKCS12Backup(res, req); } } else if (SSM_HTTPParamValue(req, "restore", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSMSecurityAdvisorContext_DoPKCS12Restore(res, req); } } else if (SSM_HTTPParamValue(req, "delete", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSM_ProcessCertDeleteButton(req); } } else if (SSM_HTTPParamValue(req, "password", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSM_ProcessPasswordWindow(req); } } else if (SSM_HTTPParamValue(req, "ldap", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSM_ProcessLDAPWindow(req); } } else if (SSM_HTTPParamValue(req, "backup_all", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSMSecurityAdvisorContext_BackupAllMineCerts(res, req); } } else if (SSM_HTTPParamValue(req, "crlButton", &button) == SSM_SUCCESS) { if (button != NULL) { rv = SSM_HTTPReportError(req, HTTP_NO_CONTENT); } } return rv;}static SSMStatusSSMSecurityAdvisorContext_SetConfigOCSP(SSMSecurityAdvisorContext *cx, HTTPRequest *req){ char *responderURL = NULL, *caNickname = NULL; char *enableOCSP = NULL; CERTCertDBHandle *db; SSMStatus rv; SECStatus srv; db = cx->super.m_connection->m_certdb; rv = SSM_HTTPParamValue(req, "enableOCSP", &enableOCSP); if (rv != SSM_SUCCESS) { goto loser; } if (!strcmp(enableOCSP,"noOCSP")) { CERT_DisableOCSPChecking(db); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.enabled", PR_FALSE); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.useDefaultResponder", PR_FALSE); CERT_DisableOCSPChecking(db); CERT_DisableOCSPDefaultResponder(db); } else if (!strcmp(enableOCSP,"noDefaultResponder")) { srv = CERT_EnableOCSPChecking(db); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.enabled", PR_TRUE); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.useDefaultResponder", PR_FALSE); if (srv != SECSuccess) { goto loser; } CERT_DisableOCSPDefaultResponder(db); } else if (!strcmp(enableOCSP,"useDefaultResponder")) { srv = CERT_EnableOCSPChecking(db); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.enabled", PR_TRUE); SSMControlConnection_SaveBoolPref(req->ctrlconn, "security.OCSP.useDefaultResponder", PR_TRUE); if (srv != SECSuccess) { goto loser; } rv = SSM_HTTPParamValue(req, "ocspURL", &responderURL); if (rv != SSM_SUCCESS) { goto loser; } SSMControlConnection_SaveStringPref(req->ctrlconn, "security.OCSP.URL", responderURL); rv = SSM_HTTPParamValue(req, "selectCert", &caNickname); if (rv != SSM_SUCCESS) { goto loser; } SSMControlConnection_SaveStringPref(req->ctrlconn, "security.OCSP.signingCA", caNickname); srv = CERT_SetOCSPDefaultResponder(db, responderURL, caNickname); if (srv != SECSuccess) { goto loser; } srv = CERT_EnableOCSPDefaultResponder(db); if (srv != SECSuccess) { goto loser; } } else { goto loser; } return SSM_SUCCESS; loser: return SSM_FAILURE;}static SSMStatusSSMSecurityAdvisorContext_ProcessOCSPForm(SSMSecurityAdvisorContext *cx, HTTPRequest *req){ SSMStatus rv = SSM_SUCCESS; /* * First, if the Cancel button was pressed, then don't * process the form. */ if (cx->super.m_buttonType == SSM_BUTTON_OK) { rv = SSMSecurityAdvisorContext_SetConfigOCSP(cx, req); } SSM_HTTPDefaultCommandHandler(req); return rv;}SSMStatus SSMSecurityAdvisorContext_FormSubmitHandler(SSMResource *res, HTTPRequest *req){ SSMStatus rv; char *formName; if (!SSM_IsAKindOf(res, SSM_RESTYPE_SECADVISOR_CONTEXT)) { return SSM_FAILURE; } /* First figure out which form we're processing. */ rv = SSM_HTTPParamValue(req, "formName", &formName); if (rv != SSM_SUCCESS) { goto loser; } if (PL_strcmp(formName, "prefs_submit_form") == 0) { /* save pref changes and close the Security Advisor */ rv = SSMSecurityAdvisorContext_SavePrefs ((SSMSecurityAdvisorContext*)res, req); } else if (!strcmp(formName, "cert_mine_form") || !strcmp(formName, "cert_others_form") || !strcmp(formName, "cert_websites_form") || !strcmp(formName, "cert_authorities_form")) { rv = SSMSecurityAdvisorContext_Process_cert_mine_form ((SSMSecurityAdvisorContext*)res, req); } else if (!strcmp(formName, "choose_cert_by_usage")) { rv = SSM_ChooseCertUsageHandler(req); } else if (!strcmp(formName, "set_db_password")) { rv = SSM_SetDBPasswordHandler(req); } else if (!strcmp(formName, "configureOCSPForm")){ rv = SSMSecurityAdvisorContext_ProcessOCSPForm ((SSMSecurityAdvisorContext*)res, req); } else if (!strcmp(formName, "crlDialog")){ rv = SSMSecurityAdvisorContext_ProcessCRLDialog(req); }else { rv = SSM_ERR_BAD_REQUEST; SSM_HTTPReportSpecificError(req, "Do not know how to process form %s", formName); } loser: return rv;}SSMStatusSSMSecurityAdvisorContext_Print(SSMResource *res, char *fmt, PRIntn numParam, char **value, char **resultStr){ SSMSecurityAdvisorContext *cx = (SSMSecurityAdvisorContext*)res; SSMStatus rv; PR_ASSERT(fmt != NULL && resultStr != NULL); if (!SSM_IsAKindOf(res, SSM_RESTYPE_SECADVISOR_CONTEXT)) { return PR_FAILURE; } /* We don't use the extra parameters */ if (cx->m_nickname != NULL) { *resultStr = PR_smprintf(fmt, res->m_id, "backup", cx->m_nickname, *value); rv = (*resultStr == NULL) ? PR_FAILURE : PR_SUCCESS; } else { rv = SSMResource_Print(res, fmt, numParam, value, resultStr); } return rv;}SSMStatus SSM_SetSelectedItemInfo(SSMSecurityAdvisorContext* cx){ SSMStatus rv = SSM_SUCCESS; switch (cx->infoContext) { case SSM_NOINFO: cx->selectedItemPage = SSM_NO_INFO; break; case SSM_COMPOSE: break; case SSM_SNEWS_MESSAGE: case SSM_NEWS_MESSAGE: case SSM_MAIL_MESSAGE: cx->selectedItemPage = SSM_MESSAGE; if (cx->encryptedP7CInfo) { /* Get the P7 Content info resource */ rv = SSMControlConnection_GetResource(SSMRESOURCE(cx)->m_connection, (SSMResourceID)cx->encryptedP7CInfo, (SSMResource**)&cx->encryptedP7CInfoRes); if ((rv != PR_SUCCESS) || (cx->encryptedP7CInfoRes == NULL)) { goto loser; } } if (cx->signedP7CInfo) { /* Get the P7 Content info resource */ rv = SSMControlConnection_GetResource(SSMRESOURCE(cx)->m_connection, (SSMResourceID)cx->signedP7CInfo, (SSMResource**)&cx->signedP7CInfoRes); if ((rv != PR_SUCCESS) || (cx->signedP7CInfoRes == NULL)) { goto loser; } } if (!cx->encryptedP7CInfo && !cx->signedP7CInfo && cx->verifyError && !cx->decodeError) { /* Somehow we have the error code backwards */ cx->decodeError = cx->verifyError; cx->verifyError = 0; } cx->encrypted_b = (cx->decodeError || (cx->encryptedP7CInfo && SEC_PKCS7ContentIsEncrypted(cx->encryptedP7CInfoRes->m_cinfo)) || (cx->signedP7CInfo && SEC_PKCS7ContentIsEncrypted(cx->signedP7CInfoRes->m_cinfo))); cx->signed_b = (cx->verifyError || (cx->encryptedP7CInfo && SEC_PKCS7ContentIsSigned(cx->encryptedP7CInfoRes->m_cinfo)) || (cx->signedP7CInfo && SEC_PKCS7ContentIsSigned(cx->signedP7CInfoRes->m_cinfo))); break; case SSM_BROWSER: if (cx->resID == 0) { cx->selectedItemPage = SSM_NAVIGATOR_NO_SEC; } else { cx->selectedItemPage = SSM_NAVIGATOR_SSL; } break; default: cx->selectedItemPage = SSM_NO_INFO; break; } return rv;loser: return SSM_FAILURE;}SSMStatus sa_noinfo(SSMTextGenContext *cx){ SSMStatus rv = SSM_SUCCESS; SSMResource *target = NULL; SSMSecurityAdvisorContext* res = NULL; char *fmt = NULL; /* get the connection object */ target = SSMTextGen_GetTargetObject(cx); PR_ASSERT(target != NULL); res = (SSMSecurityAdvisorContext*)target; rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_noinfo", &fmt); if (rv != SSM_SUCCESS) { goto loser; } PR_FREEIF(cx->m_result); cx->m_result = fmt; return SSM_SUCCESS;loser: return SSM_FAILURE;}SSMStatus sa_navigator(SSMTextGenContext *cx){ SSMStatus rv = SSM_SUCCESS; SSMResource *target = NULL; SSMSecurityAdvisorContext* res = NULL; char *fmt = NULL; SSMSSLSocketStatus *socketStatusRes = NULL; char * encryption_level = NULL; char * serverCN = NULL; char * issuerName = NULL; CERTCertificate *issuerCert = NULL; SSMResourceCert *serverCertRes = NULL, *issuerCertRes = NULL; int serverCertResID, issuerCertResID; /* get the connection object */ target = SSMTextGen_GetTargetObject(cx); PR_ASSERT(target != NULL); res = (SSMSecurityAdvisorContext*)target; if (res->resID == 0) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_no_sec", &fmt); if (rv != SSM_SUCCESS) { goto loser; } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, res->hostname); PR_Free(fmt); return SSM_SUCCESS; } else { /* Get the socket status resource */ rv = SSMControlConnection_GetResource(SSMRESOURCE(res)->m_connection, (SSMResourceID)res->resID, (SSMResource**)&socketStatusRes); if ((rv != PR_SUCCESS) || (socketStatusRes == NULL)) { goto loser; } /* * We inherit the client's reference here. */ res->socketStatus = socketStatusRes; /* Do we have an error */ if (!socketStatusRes->m_error) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_ssl", &fmt); if (rv != SSM_SUCCESS) { goto loser; }#if 0 /* Create a resource for this cert */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, socketStatusRes->m_cert, SSMRESOURCE(res)->m_connection, (long *) &serverCertResID, (SSMResource**)&serverCertRes); if (rv != PR_SUCCESS) { goto loser; }#else serverCertResID = socketStatusRes->m_cert->super.m_id; serverCertRes = socketStatusRes->m_cert;#endif issuerName = CERT_NameToAscii(&socketStatusRes->m_cert->cert->issuer); if (socketStatusRes->m_level == SSL_SECURITY_STATUS_ON_HIGH) { SSM_GetUTF8Text(cx, "high_grade_encryption", &encryption_level); } else { SSM_GetUTF8Text(cx, "low_grade_encryption", &encryption_level); } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, issuerName, target->m_id, serverCertResID, encryption_level, socketStatusRes->m_cipherName, socketStatusRes->m_secretKeySize); PR_Free(issuerName); PR_Free(encryption_level); PR_Free(fmt); SSM_FreeResource(&socketStatusRes->super); return SSM_SUCCESS; } else { if (socketStatusRes->m_error == SEC_ERROR_UNKNOWN_ISSUER || socketStatusRes->m_error == SEC_ERROR_CA_CERT_INVALID ) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_ssl_unknown_issuer", &fmt); if (rv != SSM_SUCCESS) { goto loser; } /* Get the common name of the issuer */ issuerName = CERT_NameToAscii(&socketStatusRes->m_cert->cert->issuer); if (!issuerName) { goto loser; } /* Get the common name of the server cert */ serverCN = CERT_GetCommonName(&socketStatusRes->m_cert->cert->subject);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?