From 82a6e7c51ae366568e7e293b8ffaf2fe69f9c21a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Sun, 2 Feb 2025 03:05:20 -0500
Subject: [PATCH] Add Socket.tls_psk_id property

If tls_psk is used, indicates which entry in tls_psk was used by
the remote.
---
 src/sbbs3/js_socket.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index 668c9b23c0..d17e97ecc1 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -2244,6 +2244,7 @@ enum {
 	, SOCK_PROP_SSL_SERVER
 	, SOCK_PROP_TLS_MINVER
 	, SOCK_PROP_TLS_PSK
+	, SOCK_PROP_TLS_PSK_ID
 
 };
 
@@ -2639,6 +2640,25 @@ static JSBool js_socket_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 			else
 				*vp = OBJECT_TO_JSVAL(p->tls_psk);
 			break;
+		case SOCK_PROP_TLS_PSK_ID:
+			if (p->tls_psk == NULL)
+				*vp = JSVAL_VOID;
+			else {
+				int idlen;
+				if ((cryptGetAttributeString(p->session, CRYPT_SESSINFO_USERNAME, NULL, &idlen) == CRYPT_OK) && (idlen > 0)) {
+					char *id = malloc(idlen);
+					if (id) {
+						if (cryptGetAttributeString(p->session, CRYPT_SESSINFO_USERNAME, id, &idlen) == CRYPT_OK) {
+							if ((js_str = JS_NewStringCopyN(cx, id, idlen)) == NULL) {
+								free(id);
+								return JS_FALSE;
+							}
+							*vp = STRING_TO_JSVAL(js_str);
+						}
+						free(id);
+					}
+				}
+			}
 	}
 
 	JS_RESUMEREQUEST(cx, rc);
@@ -2672,6 +2692,7 @@ static jsSyncPropertySpec js_socket_properties[] = {
 	{   "ssl_server", SOCK_PROP_SSL_SERVER, JSPROP_ENUMERATE,  316 },
 	{   "tls_minver", SOCK_PROP_TLS_MINVER, JSPROP_ENUMERATE,  320 },
 	{   "tls_psk", SOCK_PROP_TLS_PSK, JSPROP_ENUMERATE,  320 },
+	{   "tls_psk_id", SOCK_PROP_TLS_PSK_ID, JSPROP_ENUMERATE | JSPROP_READONLY,  320 },
 	{0}
 };
 
-- 
GitLab