Skip to content

Commit 916b4ba

Browse files
author
Michael O'Brien
committed
DEV: update paks
1 parent 9ea2b50 commit 916b4ba

File tree

22 files changed

+1030
-547
lines changed

22 files changed

+1030
-547
lines changed

paks/certs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ Test certificates.
1515

1616
## Get Pak
1717

18-
[https://embedthis.com/pak/](https://embedthis.com/pak/)
18+
[https://www.embedthis.com/pak/](https://www.embedthis.com/pak/)

paks/certs/pak.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "certs",
33
"title": "Test Certificates",
44
"description": "Test Certificates",
5-
"version": "0.1.6",
5+
"version": "1.0.0",
66
"keywords": [
77
"me",
88
"ssl",

paks/http/dist/http.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,14 @@ static int parseArgs(int argc, char **argv)
507507
}
508508
setWorkers++;
509509

510+
} else if (smatch(argp, "-x")) {
511+
// Undocumented and unsupported (-D --nofollow -s)
512+
mprSetDebugMode(1);
513+
app->retries = 0;
514+
app->timeout = HTTP_UNLIMITED;
515+
app->nofollow++;
516+
app->showHeaders++;
517+
510518
} else if (smatch(argp, "--zero")) {
511519
app->zeroOnErrors++;
512520

paks/http/dist/http.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ struct HttpWebSocket;
9999
#ifndef ME_HTTP_DELAY
100100
#define ME_HTTP_DELAY (2000) /**< 2 second delay per request - while delay enforced */
101101
#endif
102+
#ifndef ME_DIGEST_NONCE_DURATION
103+
#define ME_DIGEST_NONCE_DURATION 60 /**< Lifespan for Digest auth request nonce */
104+
#endif
102105
#ifndef ME_MAX_URI
103106
#define ME_MAX_URI 512 /**< Reasonable URI size */
104107
#endif

paks/http/dist/httpLib.c

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6988,7 +6988,7 @@ PUBLIC int httpDigestParse(HttpConn *conn, cchar **username, cchar **password)
69886988
httpTrace(conn, "auth.digest.error", "error", "msg:'Access denied, Bad qop'");
69896989
return MPR_ERR_BAD_STATE;
69906990

6991-
} else if ((when + (5 * 60)) < time(0)) {
6991+
} else if ((when + ME_DIGEST_NONCE_DURATION) < time(0)) {
69926992
httpTrace(conn, "auth.digest.error", "error", "msg:'Access denied, Nonce is stale'");
69936993
return MPR_ERR_BAD_STATE;
69946994
}
@@ -12278,23 +12278,26 @@ static void outgoingRangeService(HttpQueue *q)
1227812278
}
1227912279
}
1228012280
for (packet = httpGetPacket(q); packet; packet = httpGetPacket(q)) {
12281-
if (packet->flags & HTTP_PACKET_DATA) {
12282-
if (!applyRange(q, packet)) {
12283-
return;
12284-
}
12285-
} else {
12286-
/*
12287-
Send headers and end packet downstream
12288-
*/
12289-
if (packet->flags & HTTP_PACKET_END && tx->rangeBoundary) {
12290-
httpPutPacketToNext(q, createFinalRangePacket(conn));
12291-
}
12292-
if (!httpWillNextQueueAcceptPacket(q, packet)) {
12293-
httpPutBackPacket(q, packet);
12294-
return;
12281+
if (tx->outputRanges) {
12282+
if (packet->flags & HTTP_PACKET_DATA) {
12283+
if (!applyRange(q, packet)) {
12284+
return;
12285+
}
12286+
continue;
12287+
} else {
12288+
/*
12289+
Send headers and end packet downstream
12290+
*/
12291+
if (packet->flags & HTTP_PACKET_END && tx->rangeBoundary) {
12292+
httpPutPacketToNext(q, createFinalRangePacket(conn));
12293+
}
1229512294
}
12296-
httpPutPacketToNext(q, packet);
1229712295
}
12296+
if (!httpWillNextQueueAcceptPacket(q, packet)) {
12297+
httpPutBackPacket(q, packet);
12298+
return;
12299+
}
12300+
httpPutPacketToNext(q, packet);
1229812301
}
1229912302
}
1230012303

@@ -15307,7 +15310,9 @@ static char *expandRequestTokens(HttpConn *conn, char *str)
1530715310
if ((key = stok(&tok[2], ".:}", &value)) == 0) {
1530815311
continue;
1530915312
}
15310-
if ((stok(value, "}", &cp)) == 0) {
15313+
if ((stok(value, "}", &p)) != 0) {
15314+
cp = p;
15315+
} else {
1531115316
continue;
1531215317
}
1531315318
if (smatch(key, "header")) {
@@ -15422,7 +15427,7 @@ static char *expandRequestTokens(HttpConn *conn, char *str)
1542215427
}
1542315428
assert(cp);
1542415429
if (tok) {
15425-
if (tok > cp) {
15430+
if (cp && tok > cp) {
1542615431
mprPutBlockToBuf(buf, tok, tok - cp);
1542715432
}
1542815433
} else {
@@ -16406,7 +16411,7 @@ static bool parseResponseLine(HttpConn *conn, HttpPacket *packet)
1640616411
tx = conn->tx;
1640716412

1640816413
protocol = getToken(conn, NULL, TOKEN_WORD);
16409-
if (protocol == NULL || protocol == '\0') {
16414+
if (protocol == NULL || *protocol == '\0') {
1641016415
httpBadRequestError(conn, HTTP_ABORT | HTTP_CODE_NOT_ACCEPTABLE, "Unsupported HTTP protocol");
1641116416
return 0;
1641216417
}
@@ -16808,7 +16813,7 @@ static bool parseHeaders(HttpConn *conn, HttpPacket *packet)
1680816813
if (conn->http10 && !keepAliveHeader) {
1680916814
conn->keepAliveCount = 0;
1681016815
}
16811-
if (httpClientConn(conn) && conn->mustClose && rx->length < 0) {
16816+
if (httpClientConn(conn) && conn->mustClose && rx->length < 0 && rx->status != 204) {
1681216817
/*
1681316818
Google does responses with a body and without a Content-Lenght like this:
1681416819
Connection: close

paks/mpr-mbedtls/mpr-mbedtls.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ static void merror(int rc, cchar *fmt, ...);
6868
static int parseCert(mbedtls_x509_crt *cert, cchar *file, char **errorMsg);
6969
static int parseCrl(mbedtls_x509_crl *crl, cchar *path, char **errorMsg);
7070
static int parseKey(mbedtls_pk_context *key, cchar *path, char **errorMsg);
71+
static int preloadMbed(MprSsl *ssl, int flags);
7172
static ssize readMbed(MprSocket *sp, void *buf, ssize len);
7273
static char *replaceHyphen(char *cipher, char from, char to);
7374
PUBLIC int sniCallback(void *unused, mbedtls_ssl_context *ctx, cuchar *hostname, size_t len);
@@ -92,6 +93,7 @@ PUBLIC int mprSslInit(void *unused, MprModule *module)
9293
mbedProvider->upgradeSocket = upgradeMbed;
9394
mbedProvider->closeSocket = closeMbed;
9495
mbedProvider->disconnectSocket = disconnectMbed;
96+
mbedProvider->preload = preloadMbed;
9597
mbedProvider->readSocket = readMbed;
9698
mbedProvider->writeSocket = writeMbed;
9799
mbedProvider->socketState = getMbedState;
@@ -405,30 +407,37 @@ static int handshakeMbed(MprSocket *sp)
405407
mbedtls_strerror(-rc, ebuf, sizeof(ebuf));
406408
sp->errorMsg = sfmt("%s: error -0x%x", ebuf, -rc);
407409
}
408-
sp->flags |= MPR_SOCKET_EOF;
410+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR;
409411
errno = EPROTO;
410412
return MPR_ERR_CANT_READ;
411413
}
412414
if ((vrc = mbedtls_ssl_get_verify_result(&mb->ctx)) != 0) {
413415
if (vrc & MBEDTLS_X509_BADCERT_MISSING) {
414416
sp->errorMsg = sclone("Certificate missing");
417+
sp->flags |= MPR_SOCKET_CERT_ERROR;
415418

416419
} if (vrc & MBEDTLS_X509_BADCERT_EXPIRED) {
417420
sp->errorMsg = sclone("Certificate expired");
421+
sp->flags |= MPR_SOCKET_CERT_ERROR;
418422

419423
} else if (vrc & MBEDTLS_X509_BADCERT_REVOKED) {
420424
sp->errorMsg = sclone("Certificate revoked");
425+
sp->flags |= MPR_SOCKET_CERT_ERROR;
421426

422427
} else if (vrc & MBEDTLS_X509_BADCERT_CN_MISMATCH) {
423428
sp->errorMsg = sclone("Certificate common name mismatch");
429+
sp->flags |= MPR_SOCKET_CERT_ERROR;
424430

425431
} else if (vrc & MBEDTLS_X509_BADCERT_KEY_USAGE || vrc & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE) {
426432
sp->errorMsg = sclone("Unauthorized key use in certificate");
433+
sp->flags |= MPR_SOCKET_CERT_ERROR;
427434

428435
} else if (vrc & MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
429436
sp->errorMsg = sclone("Certificate not trusted");
430437
if (!sp->ssl->verifyIssuer) {
431438
vrc = 0;
439+
} else {
440+
sp->flags |= MPR_SOCKET_CERT_ERROR;
432441
}
433442

434443
} else if (vrc & MBEDTLS_X509_BADCERT_SKIP_VERIFY) {
@@ -440,15 +449,18 @@ static int handshakeMbed(MprSocket *sp)
440449
} else {
441450
if (mb->ctx.client_auth && !sp->ssl->certFile) {
442451
sp->errorMsg = sclone("Server requires a client certificate");
452+
sp->flags |= MPR_SOCKET_CERT_ERROR;
443453

444454
} else if (rc == MBEDTLS_ERR_NET_CONN_RESET) {
445455
sp->errorMsg = sclone("Peer disconnected");
456+
sp->flags |= MPR_SOCKET_ERROR;
446457

447458
} else {
448459
char ebuf[256];
449460
mbedtls_x509_crt_verify_info(ebuf, sizeof(ebuf), "", vrc);
450461
strim(ebuf, "\n", 0);
451462
sp->errorMsg = sfmt("Cannot handshake: %s, error -0x%x", ebuf, -rc);
463+
sp->flags |= MPR_SOCKET_ERROR;
452464
}
453465
}
454466
}
@@ -505,7 +517,7 @@ static int getPeerCertInfo(MprSocket *sp)
505517
if (mprGetLogLevel() >= 6) {
506518
char buf[4096];
507519
mbedtls_x509_crt_info(buf, sizeof(buf) - 1, "", peer);
508-
mprLog("info mbedtls", 6, "Peer certificate\n%s", buf);
520+
mprLog("info mbedtls", mbedLogLevel, "Peer certificate\n%s", buf);
509521
}
510522
}
511523
sp->cipher = replaceHyphen(sclone(mbedtls_ssl_get_ciphersuite(ctx)), '-', '_');
@@ -529,6 +541,11 @@ static int getPeerCertInfo(MprSocket *sp)
529541
return 0;
530542
}
531543

544+
static int preloadMbed(MprSsl *ssl, int flags)
545+
{
546+
mprLog("error mpr ssl openssl", 4, "Preload not yet supported with MbedTLS");
547+
return 0;
548+
}
532549

533550
/*
534551
Return the number of bytes read. Return -1 on errors and EOF. Distinguish EOF via mprIsSocketEof.
@@ -604,7 +621,7 @@ static ssize writeMbed(MprSocket *sp, cvoid *buf, ssize len)
604621
rc = 0;
605622
do {
606623
rc = mbedtls_ssl_write(&mb->ctx, (uchar*) buf, (int) len);
607-
mprDebug("debug mpr ssl mbedtls", 6, "mbedtls write: write returned %d (0x%04x), len %zd", rc, rc, len);
624+
mprDebug("debug mpr ssl mbedtls", mbedLogLevel, "mbedtls write: write returned %d (0x%04x), len %zd", rc, rc, len);
608625
if (rc <= 0) {
609626
if (rc == MBEDTLS_ERR_SSL_WANT_READ || rc == MBEDTLS_ERR_SSL_WANT_WRITE) {
610627
break;
@@ -826,11 +843,11 @@ static int *getCipherSuite(MprSsl *ssl)
826843
static int once = 0;
827844
if (!once++) {
828845
cp = (ciphers && *ciphers) ? result : mbedtls_ssl_list_ciphersuites();
829-
mprLog("info mbedtls", 6, "\nCiphers:");
846+
mprLog("info mbedtls", mbedLogLevel, "\nCiphers:");
830847
for (; *cp; cp++) {
831848
scopy(buf, sizeof(buf), mbedtls_ssl_get_ciphersuite_name(*cp));
832849
replaceHyphen(buf, '-', '_');
833-
mprLog("info mbedtls", 6, "0x%04X %s", *cp, buf);
850+
mprLog("info mbedtls", mbedLogLevel, "0x%04X %s", *cp, buf);
834851
}
835852
}
836853
}

paks/mpr-mbedtls/mpr-mbedtls.me

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ Me.load({
2525
conflicts: [ 'openssl', 'matrixssl', 'nanossl' ]
2626
depends: [ 'libmpr-mbedtls', 'libmbedtls' ],
2727
location: '${SRC}/mpr-mbedtls',
28+
'-compiler': [
29+
'-Wall',
30+
'-Wshorten-64-to-32',
31+
'-W3',
32+
],
33+
'+defines': [
34+
'-D_FILE_OFFSET_BITS=64'
35+
]
2836
},
2937

3038
'libmpr-mbedtls': {

paks/mpr-openssl/mpr-openssl.c

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ static void manageOpenConfig(OpenConfig *cfg, int flags);
261261
static void manageOpenProvider(MprSocketProvider *provider, int flags);
262262
static void manageOpenSocket(OpenSocket *ssp, int flags);
263263
static cchar *mapCipherNames(cchar *ciphers);
264+
static int preloadOss(MprSsl *ssl, int flags);
264265
static ssize readOss(MprSocket *sp, void *buf, ssize len);
265266
static void setSecured(MprSocket *sp);
266267
static int setCertFile(SSL_CTX *ctx, cchar *certFile);
@@ -302,6 +303,7 @@ PUBLIC int mprSslInit(void *unused, MprModule *module)
302303
return MPR_ERR_MEMORY;
303304
}
304305
openProvider->name = sclone("openssl");
306+
openProvider->preload = preloadOss;
305307
openProvider->upgradeSocket = upgradeOss;
306308
openProvider->closeSocket = closeOss;
307309
openProvider->disconnectSocket = disconnectOss;
@@ -892,6 +894,26 @@ static void closeOss(MprSocket *sp, bool gracefully)
892894
}
893895

894896

897+
static int preloadOss(MprSsl *ssl, int flags)
898+
{
899+
char *errorMsg;
900+
901+
assert(ssl);
902+
903+
if (ssl == 0) {
904+
ssl = mprCreateSsl(flags & MPR_SOCKET_SERVER);
905+
}
906+
lock(ssl);
907+
if (configOss(ssl, flags, &errorMsg) < 0) {
908+
mprLog("error mpr ssl openssl", 4, "Cannot configure SSL %s", errorMsg);
909+
unlock(ssl);
910+
return MPR_ERR_CANT_INITIALIZE;
911+
}
912+
unlock(ssl);
913+
return 0;
914+
}
915+
916+
895917
/*
896918
Upgrade a standard socket to use SSL/TLS. Used by both clients and servers to upgrade a socket for SSL.
897919
If a client, this may block while connecting.
@@ -1015,19 +1037,20 @@ static ssize readOss(MprSocket *sp, void *buf, ssize len)
10151037
retries = 5;
10161038
for (i = 0; i < retries; i++) {
10171039
rc = SSL_read(osp->handle, buf, (int) len);
1018-
if (rc < 0) {
1040+
if (rc <= 0) {
10191041
error = SSL_get_error(osp->handle, rc);
10201042
if (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_CONNECT || error == SSL_ERROR_WANT_ACCEPT) {
10211043
continue;
10221044
}
10231045
mprLog("info mpr ssl openssl", 5, "SSL_read %s", getOssError(sp));
1046+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR;
10241047
}
10251048
break;
10261049
}
10271050
if (osp->cfg->maxHandshakes && osp->handshakes > osp->cfg->maxHandshakes) {
10281051
mprLog("error mpr ssl openssl", 4, "TLS renegotiation attack");
10291052
rc = -1;
1030-
sp->flags |= MPR_SOCKET_EOF;
1053+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR;
10311054
return MPR_ERR_BAD_STATE;
10321055
}
10331056
if (rc <= 0) {
@@ -1040,17 +1063,18 @@ static ssize readOss(MprSocket *sp, void *buf, ssize len)
10401063
sp->flags |= MPR_SOCKET_EOF;
10411064
rc = -1;
10421065
} else if (error == SSL_ERROR_SYSCALL) {
1043-
sp->flags |= MPR_SOCKET_EOF;
1066+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR;
10441067
rc = -1;
10451068
} else if (error != SSL_ERROR_ZERO_RETURN) {
10461069
/* SSL_ERROR_SSL */
10471070
mprLog("info mpr ssl openssl", 4, "%s", getOssError(sp));
10481071
rc = -1;
1049-
sp->flags |= MPR_SOCKET_EOF;
1072+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR;
10501073
}
10511074
} else {
10521075
if (!(sp->flags & MPR_SOCKET_SERVER) && !sp->secured) {
10531076
if (checkPeerCertName(sp) < 0) {
1077+
sp->flags |= MPR_SOCKET_EOF | MPR_SOCKET_CERT_ERROR;
10541078
return MPR_ERR_BAD_STATE;
10551079
}
10561080
}

0 commit comments

Comments
 (0)