PUBLIC cchar *sjoinArgs(int argc, cchar **argv, cchar *sep) { MprBuf *buf; int i; if (sep == 0) { sep = ""; } buf = mprCreateBuf(0, 0); for (i = 0; i < argc; i++) { mprPutToBuf(buf, "%s%s", argv[i], sep); } if (argc > 0) { mprAdjustBufEnd(buf, -1); } return mprBufToString(buf); }
/* Get the SSL state of the socket in a buffer */ static char *getOssState(MprSocket *sp) { OpenSocket *osp; MprBuf *buf; X509 *cert; char subject[512], issuer[512]; osp = sp->sslSocket; buf = mprCreateBuf(0, 0); mprPutToBuf(buf, "{\"provider\":\"openssl\",\"cipher\":\"%s\",\"session\":\"%s\",", SSL_get_cipher(osp->handle), sp->session); mprPutToBuf(buf, "\"peer\":\"%s\",", sp->peerName); mprPutToBuf(buf, "\"%s\":{", sp->acceptIp ? "client" : "server"); if ((cert = SSL_get_peer_certificate(osp->handle)) != 0) { X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer) -1); mprPutToBuf(buf, "\"issuer\": {"); parseCertFields(buf, &issuer[1]); mprPutToBuf(buf, "},"); X509_NAME_oneline(X509_get_subject_name(cert), subject, sizeof(subject) -1); mprPutToBuf(buf, "\"subject\": {"); parseCertFields(buf, &subject[1]); mprPutToBuf(buf, "},"); X509_free(cert); } if ((cert = SSL_get_certificate(osp->handle)) != 0) { mprPutToBuf(buf, "\"issuer\": {"); X509_NAME_oneline(X509_get_issuer_name(cert), issuer, sizeof(issuer) -1); parseCertFields(buf, &issuer[1]); mprPutToBuf(buf, "},"); mprPutToBuf(buf, "\"subject\": {"); X509_NAME_oneline(X509_get_subject_name(cert), subject, sizeof(subject) -1); parseCertFields(buf, &subject[1]); mprPutToBuf(buf, "},"); /* Don't call X509_free on own cert */ } mprAdjustBufEnd(buf, -1); mprPutToBuf(buf, "}}"); return mprBufToString(buf); }
static char *getOssSession(MprSocket *sp) { SSL_SESSION *sess; OpenSocket *osp; MprBuf *buf; int i; osp = sp->sslSocket; if ((sess = SSL_get0_session(osp->handle)) != 0) { if (sess->session_id_length == 0 && osp->handle->tlsext_ticket_expected) { return sclone("ticket"); } buf = mprCreateBuf((sess->session_id_length * 2) + 1, 0); assert(buf->start); for (i = 0; i < (int) sess->session_id_length; i++) { mprPutToBuf(buf, "%02X", (uchar) sess->session_id[i]); } return mprBufToString(buf); } return 0; }
/* Map iana names to OpenSSL names so users can provide IANA names as well as OpenSSL cipher names */ static cchar *mapCipherNames(cchar *ciphers) { MprBuf *buf; CipherMap *cp; char *cipher, *next; if (!ciphers || *ciphers == 0) { return 0; } buf = mprCreateBuf(0, 0); for (next = sclone(ciphers); (cipher = stok(next, ":, \t", &next)) != 0; ) { for (cp = cipherMap; cp->name; cp++) { if (smatch(cp->name, cipher)) { mprPutToBuf(buf, "%s:", cp->ossName); break; } } if (cp->name == 0) { mprPutToBuf(buf, "%s:", cipher); } } return mprBufToString(buf); }