From ae28bc7930857c52d965b0d66a94fe699eb19672 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Mon, 7 Jul 2025 13:34:33 -0400 Subject: [PATCH] fix -pw bug in dnssd.c (fixes #426) --- lib/dnssd.c | 8 +++++--- lib/raop_handlers.h | 2 +- uxplay.cpp | 14 +++++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/dnssd.c b/lib/dnssd.c index 90f152b..b66563c 100644 --- a/lib/dnssd.c +++ b/lib/dnssd.c @@ -164,8 +164,8 @@ dnssd_init(const char* name, int name_len, const char* hw_addr, int hw_addr_len, unsigned long features; /* pin_pw = 0: no pin or password 1: use onscreen pin for client access control - 2: require password for client accress control. - */ + 2 or 3: require password for client access control + */ if (error) *error = DNSSD_ERROR_NOERROR; @@ -308,6 +308,7 @@ dnssd_register_raop(dnssd_t *dnssd, unsigned short port) dnssd->TXTRecordSetValue(&dnssd->raop_record, "rhd", strlen(RAOP_RHD), RAOP_RHD); switch (dnssd->pin_pw) { case 2: + case 3: dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true"); dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 4, "0x84"); break; @@ -316,7 +317,7 @@ dnssd_register_raop(dnssd_t *dnssd, unsigned short port) dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 3, "0x8c"); break; default: - dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "false"); + dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("false"), "false"); dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", strlen(RAOP_SF), RAOP_SF); break; } @@ -384,6 +385,7 @@ dnssd_register_airplay(dnssd_t *dnssd, unsigned short port) dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4"); break; case 2: // require password + case 3: dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true"); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4"); break; diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index 37d3db9..5003cbe 100644 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -588,7 +588,7 @@ raop_handler_setup(raop_conn_t *conn, if (!conn->authenticated && conn->raop->callbacks.passwd) { int len; const char *password = conn->raop->callbacks.passwd(conn->raop->callbacks.cls, &len); - // len = -1 means use a random password for this connection + // len = -1 means use a random password for this connection; len = 0 means no password if (len == -1 && conn->raop->random_pw && conn->raop->auth_fail_count >= 5) { // change random_pw after 5 failed authentication attempts logger_log(conn->raop->logger, LOGGER_INFO, "Too many authentication failures: generate new random password"); diff --git a/uxplay.cpp b/uxplay.cpp index b869806..a0e936e 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -1543,8 +1543,9 @@ static int start_dnssd(std::vector hw_addr, std::string name) { return 2; } /* pin_pw controls client access - pin_pw = 1: client must enter pin displayed onscreen (first access only) + pin_pw = 1: client must enter pin displayed onscreen (first access only) = 2: client must enter password (same password for all clients) + = 3: client must enter randoe 4-digit password displayed like an onscreen pin (every access) = 0: no access control */ dnssd = dnssd_init(name.c_str(), strlen(name.c_str()), hw_addr.data(), hw_addr.size(), &dnssd_error, pin_pw); @@ -1705,12 +1706,15 @@ extern "C" void display_pin(void *cls, char *pin) { } extern "C" const char *passwd(void *cls, int *len){ - if (pin_pw == 3) { + if (pin_pw == 2) { + *len = password.size(); + return password.c_str(); + } else if (pin_pw == 3) { *len = -1; - return NULL; + } else { + *len = 0; /* no password used */ } - *len = password.size(); - return password.c_str(); + return NULL; } extern "C" void export_dacp(void *cls, const char *active_remote, const char *dacp_id) {