fix -pw bug in dnssd.c (fixes #426)

This commit is contained in:
F. Duncanh
2025-07-07 13:34:33 -04:00
parent f3db82fcfe
commit ae28bc7930
3 changed files with 15 additions and 9 deletions

View File

@@ -164,8 +164,8 @@ dnssd_init(const char* name, int name_len, const char* hw_addr, int hw_addr_len,
unsigned long features; unsigned long features;
/* pin_pw = 0: no pin or password /* pin_pw = 0: no pin or password
1: use onscreen pin for client access control 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; 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); dnssd->TXTRecordSetValue(&dnssd->raop_record, "rhd", strlen(RAOP_RHD), RAOP_RHD);
switch (dnssd->pin_pw) { switch (dnssd->pin_pw) {
case 2: case 2:
case 3:
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true"); dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true");
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 4, "0x84"); dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 4, "0x84");
break; break;
@@ -316,7 +317,7 @@ dnssd_register_raop(dnssd_t *dnssd, unsigned short port)
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 3, "0x8c"); dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 3, "0x8c");
break; break;
default: 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); dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", strlen(RAOP_SF), RAOP_SF);
break; break;
} }
@@ -384,6 +385,7 @@ dnssd_register_airplay(dnssd_t *dnssd, unsigned short port)
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4"); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4");
break; break;
case 2: // require password case 2: // require password
case 3:
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true"); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true");
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4"); dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4");
break; break;

View File

@@ -588,7 +588,7 @@ raop_handler_setup(raop_conn_t *conn,
if (!conn->authenticated && conn->raop->callbacks.passwd) { if (!conn->authenticated && conn->raop->callbacks.passwd) {
int len; int len;
const char *password = conn->raop->callbacks.passwd(conn->raop->callbacks.cls, &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) { if (len == -1 && conn->raop->random_pw && conn->raop->auth_fail_count >= 5) {
// change random_pw after 5 failed authentication attempts // change random_pw after 5 failed authentication attempts
logger_log(conn->raop->logger, LOGGER_INFO, "Too many authentication failures: generate new random password"); logger_log(conn->raop->logger, LOGGER_INFO, "Too many authentication failures: generate new random password");

View File

@@ -1543,8 +1543,9 @@ static int start_dnssd(std::vector<char> hw_addr, std::string name) {
return 2; return 2;
} }
/* pin_pw controls client access /* 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) = 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 = 0: no access control
*/ */
dnssd = dnssd_init(name.c_str(), strlen(name.c_str()), hw_addr.data(), hw_addr.size(), &dnssd_error, pin_pw); 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){ 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; *len = -1;
return NULL; } else {
*len = 0; /* no password used */
} }
*len = password.size(); return NULL;
return password.c_str();
} }
extern "C" void export_dacp(void *cls, const char *active_remote, const char *dacp_id) { extern "C" void export_dacp(void *cls, const char *active_remote, const char *dacp_id) {