📄 certlist.c
字号:
} dontInclude: *usage = thisUsage; return PR_FALSE;include: *usage = thisUsage; if (state->usage == thisUsage || (state->usage == clAllMine && (thisUsage == clSSLClient || thisUsage == clEmailSigner))) { return PR_TRUE; } return PR_FALSE;} /* build/append a cert list string depending on key and usage */SECStatus certlist_get_cert(CERTCertificate *cert, SECItem *dbkey, void *arg){ ssmCLState *state = (ssmCLState *) arg; SECStatus rv = SECSuccess; void *certHashKey; /* the key we use to insert into the hash */ ssmCLCertUsage thisUsage; ssmCertData * data; char * certInfo = NULL, *nick = NULL; char * wrapper; /* check if we want to include cert in our hash table */ if (!certlist_include_cert(cert, state, &thisUsage)) goto done; /* check if cert is already in the db */ nick = (cert->nickname)?cert->nickname:cert->emailAddr; if (SSMSortedList_Lookup(*state->hash, nick)) goto done; /* different wrapper for email certs */ if (thisUsage == clEmailRecipient) wrapper = state->efmt; else wrapper = state->fmt; /* If we get here, then we should include this cert in the hash table. */ rv = (SECStatus) (format_raw_cert(cert, wrapper, state->datefmt, &certInfo) == SSM_SUCCESS) ? SECSuccess : SECFailure; if (rv != SECSuccess) goto done; certHashKey = certlist_get_cert_key(state, cert, thisUsage); data = (ssmCertData *) PORT_ZAlloc(sizeof(ssmCertData)); data->usage = thisUsage; data->certEntry = certInfo; /* XXX the following code is necessary because we want to pick out * email signing certs among "my certs" */ if (cert->trust->emailFlags & CERTDB_USER) { data->isEmailSigner = PR_TRUE; } else { data->isEmailSigner = PR_FALSE; } SSMSortedList_Insert(*state->hash, certHashKey, data);done: return rv;}static char * escape_quotes(const char * str){ char * outstr = NULL, * ptr = NULL; int i=0, length = 0; int quotechar = 0; if (!str) goto done; ptr = str; while (*ptr) { length++; if (*ptr == 39 || *ptr == 34) quotechar++; ptr++; } outstr = (char *) PORT_ZAlloc(length+quotechar+1); if (!quotechar) { memcpy(outstr, str, length); goto done; } ptr = str; i = 0; while (i < length+quotechar) { if (*ptr == 39 || *ptr == 34) outstr[i++] = 92; outstr[i++] = *ptr; ptr++; } done: return outstr;}/* Format a raw cert into (wrapper). */static SSMStatusformat_raw_cert(){ char *nickStr = NULL; char *emailStr = NULL; char *subjectName = NULL; char *validStartStr = NULL; char *validEndStr = NULL; char * issuerName = NULL; char *isn_ch = NULL; SSMStatus rv = SSM_SUCCESS; PR_ASSERT(wrapper); /* If a date format wasn't supplied, make one. */ if (dateFormat) { /* REMOVED CALL */; } /* Get the key from the cert in b64 format */ rv = ssm_certlist_get_b64_cert_key(cert, &isn_ch); if (rv != SSM_SUCCESS) goto loser; PR_ASSERT(isn_ch); nickStr = (cert->nickname) ?escape_quotes(cert->nickname):PL_strdup("-"); emailStr = (cert->emailAddr) ?escape_quotes(cert->emailAddr):PL_strdup("-"); subjectName = (cert->subjectName) ? escape_quotes(cert->subjectName) : PL_strdup("-"); issuerName = CERT_GetOrgName(&cert->issuer); issuerName = issuerName ? escape_quotes(issuerName) : PL_strdup("-"); validStartStr = DER_UTCDayToAscii(&cert->validity.notBefore); if (!validStartStr) validStartStr = PL_strdup(""); validEndStr = DER_UTCDayToAscii(&cert->validity.notAfter); if (!validEndStr) validEndStr = PL_strdup(""); SSMTextGen_UTF8StringClear(result); *result = PR_smprintf(wrapper, isn_ch, nickStr, emailStr, subjectName, validStartStr, validEndStr, issuerName, 0); SSM_DebugUTF8String("wrapped cert", *result); goto done; loser: SSM_DEBUG("Couldn't format cert!"); if (rv == SSM_SUCCESS) rv = SSM_FAILURE; done: PR_FREEIF(nickStr); PR_FREEIF(emailStr); PR_FREEIF(subjectName); PR_FREEIF(issuerName); PR_FREEIF(isn_ch); PR_FREEIF(validStartStr); PR_FREEIF(validEndStr); if (dateFormat && !dfmt) /* if we made the date format, delete it */ /* REMOVED CALL */; return rv;}/* Enumerator for cert hash entries. Embed cert information in the wrapper (state->wrapper). */SSMStatus certlist_display_cert(PRIntn index, void * arg, void * key, void * itemdata){ ssmCLState *state = (ssmCLState *) arg; SSMStatus rv = SSM_SUCCESS; ssmCertData * data = (ssmCertData *) itemdata; if (state->usage == data->usage || (state->usage == clAllMine && (data->usage == clSSLClient || data->usage == clEmailSigner)) || (state->usage == clEmailSigner && data->usage == clAllMine && data->isEmailSigner)) { rv = SSM_ConcatenateUTF8String(&state->output, data->certEntry); if (rv != SSM_SUCCESS) goto loser; } goto done;loser: SSM_DEBUG("certlist_display_cert: couldn't add cert info to display list!");done: /* keep going */ return SSM_SUCCESS;} /* get the certType parameter */SSMStatuscertlist_get_usage(ssmCLState *state){ char *usageStr = (char *) SSM_At(state->cx->m_params, CERTLIST_PARAM_USAGE); SSMStatus rv = SSM_SUCCESS; PR_ASSERT(usageStr); if (!usageStr) { SSM_HTTPReportSpecificError(state->cx->m_request, "certlist_get_usage: " "usage parameter is NULL"); goto loser; } /* Figure out which one it is. */ if (!MIN_STRCMP(usageStr, "AllMine")) state->usage = clAllMine; else if (!MIN_STRCMP(usageStr, "SSLC")) state->usage = clSSLClient; else if (!MIN_STRCMP(usageStr, "EmailS")) state->usage = clEmailSigner; else if (!MIN_STRCMP(usageStr, "SSLS")) state->usage = clSSLServer; else if (!MIN_STRCMP(usageStr, "EmailR")) state->usage = clEmailRecipient; else if (!MIN_STRCMP(usageStr, "CA")) state->usage = clAllCA; else /* bad value */ { SSM_HTTPReportSpecificError(state->cx->m_request, "_certList: Bad usage -- must be " "AllMine|SSLClient|EmailSigner|" "SSLServer|EmailRecipient|CA"); goto loser; } goto done;loser: if (rv == SSM_SUCCESS) rv = SSM_FAILURE;done: return rv;}/* get the certType parameter */SSMStatuscertlist_get_key_type(ssmCLState *state){ char *keyStr = (char *) SSM_At(state->cx->m_params, CERTLIST_PARAM_KEY); SSMStatus rv = SSM_SUCCESS; PR_ASSERT(keyStr); if (!keyStr) { SSM_HTTPReportSpecificError(state->cx->m_request, "certlist_get_key_type: " "key parameter is NULL"); goto loser; } /* Figure out which one it is. */ if (!MIN_STRCMP(keyStr, "nick")) state->key = clNick; else if (!MIN_STRCMP(keyStr, "certID")) state->key = clCertID; else if ((!MIN_STRCMP(keyStr, "rid")) ||(!MIN_STRCMP(keyStr, "RID"))) state->key = clRID; else if (!MIN_STRCMP(keyStr, "email")) state->key = clEmail; else/* bad value */ { SSM_HTTPReportSpecificError(state->cx->m_request, "_certList: Bad cert key -- must be " "nick|certID|RID"); goto loser; } goto done;loser: if (rv == SSM_SUCCESS) rv = SSM_FAILURE;done: return rv;}SSMStatusssm_populate_key_hash(ssmCLState * state){ SSMCompare_fn keyComparer = NULL; SSMListFree_fn keyFree = NULL; SSMListFree_fn dataFree = certlist_free_data; SECStatus srv; SSMStatus rv = SSM_SUCCESS; char *tempUStr = NULL; PermCertCallback callback = certlist_get_cert; /* Based on the usage, choose hasher/key comparer functions for the hash table we create below. */ switch(state->key) { case clRID: keyComparer = certlist_rid_compare; keyFree = certlist_none; break; case clEmail: case clCertID: case clNick: keyComparer = certlist_compare_strings; keyFree = certlist_free_string; break; default: PR_ASSERT(0); } list_functions.keyCompare = keyComparer; list_functions.freeListItemData = dataFree; list_functions.freeListItemKey = keyFree; /* Create the hash table if needed */ if (!*state->hash) *state->hash = SSMSortedList_New(&list_functions); if (!*state->hash) goto loser; PR_ASSERT(state->db); /* Get the wrapper text. */ rv = SSM_GetAndExpandTextKeyedByString(state->cx, WRAPPER, &tempUStr); if (rv != SSM_SUCCESS) goto loser; /* error string set by the called function */ SSM_DebugUTF8String("Certlist wrapper", tempUStr); state->fmt = tempUStr; tempUStr = NULL; /* wrapper for email certs */ rv = SSM_GetAndExpandTextKeyedByString(state->cx, EMAIL_WRAPPER, &tempUStr); if (rv != SSM_SUCCESS) goto loser; /* error string set by the called function */ SSM_DebugUTF8String("Certlist email wrapper", tempUStr); state->efmt = tempUStr; tempUStr = NULL; /* REMOVED CALL */; /* Format each cert into the list. */ srv = SEC_TraversePermCerts(state->db, callback, state); if (srv == SECSuccess) srv = PK11_TraverseSlotCerts(callback, state, state->cx->m_request->ctrlconn); goto done; loser: if (rv == SSM_SUCCESS) rv = SSM_FAILURE;done: return rv;}/* Cert list keyword handler. Syntax: {_certList <certKey>,<certUsage>,prefix,wrapper,suffix} where <certKey> ::= "nick" | "certID" | "RID" | "email" <certUsage>::= "AllMine"|"SSLClient"|"EmailSigner"| "SSLServer"|"EmailRecipient"|"CA" (for now) Generates a list of certificates. The following steps are performed: - Send {prefix} to the client. - For each cert indicated by <certType> and <certUsage>, format the cert data into {wrapper} and send to the client. - After the certs are processed and sent, send {suffix}.*/SSMStatusSSM_CertListKeywordHandler(SSMTextGenContext *cx){ SSMStatus rv = SSM_SUCCESS; char *prefix = NULL, *suffix = NULL; char *tempUStr = NULL; SSMResource * target = NULL; ssmCLState state; SSMResourceType targetType = SSM_RESTYPE_NULL; PRIntn certType[clAllCA+1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -