mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-28 16:15:57 -05:00
Parse pairing response and save pairing GUID
The pairing GUID will be used later on to authenticate the Remote instance when it logs in.
This commit is contained in:
parent
b35c4749a2
commit
115d28e24a
@ -675,6 +675,11 @@ static void
|
|||||||
pairing_request_cb(struct evhttp_request *req, void *arg)
|
pairing_request_cb(struct evhttp_request *req, void *arg)
|
||||||
{
|
{
|
||||||
struct remote_info *ri;
|
struct remote_info *ri;
|
||||||
|
uint8_t *response;
|
||||||
|
char guid[17];
|
||||||
|
int len;
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
ri = (struct remote_info *)arg;
|
ri = (struct remote_info *)arg;
|
||||||
|
|
||||||
@ -688,7 +693,67 @@ pairing_request_cb(struct evhttp_request *req, void *arg)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(E_INFO, L_REMOTE, "Pairing succeeded with Remote '%s' (id %s)\n", ri->pi.name, ri->pi.remote_id);
|
if (EVBUFFER_LENGTH(req->input_buffer) < 8)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_REMOTE, "Remote %s/%s: pairing response too short\n", ri->pi.remote_id, ri->pi.name);
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
response = EVBUFFER_DATA(req->input_buffer);
|
||||||
|
|
||||||
|
if ((response[0] != 'c') || (response[1] != 'm') || (response[2] != 'p') || (response[3] != 'a'))
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_REMOTE, "Remote %s/%s: unknown pairing response, expected cmpa\n", ri->pi.remote_id, ri->pi.name);
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = (response[4] << 24) | (response[5] << 16) | (response[6] << 8) | (response[7]);
|
||||||
|
if (EVBUFFER_LENGTH(req->input_buffer) < 8 + len)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_REMOTE, "Remote %s/%s: pairing response truncated (got %d expected %d)\n",
|
||||||
|
ri->pi.remote_id, ri->pi.name, (int)EVBUFFER_LENGTH(req->input_buffer), len + 8);
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
response += 8;
|
||||||
|
|
||||||
|
for (; len > 0; len--, response++)
|
||||||
|
{
|
||||||
|
if ((response[0] != 'c') || (response[1] != 'm') || (response[2] != 'p') || (response[3] != 'g'))
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len -= 8;
|
||||||
|
response += 8;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len < 8)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_REMOTE, "Remote %s/%s: cmpg truncated in pairing response\n", ri->pi.remote_id, ri->pi.name);
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
sprintf(guid + (2 * i), "%02X", response[i]);
|
||||||
|
|
||||||
|
ri->pi.guid = strdup(guid);
|
||||||
|
|
||||||
|
DPRINTF(E_INFO, L_REMOTE, "Pairing succeeded with Remote '%s' (id %s), GUID: %s\n", ri->pi.name, ri->pi.remote_id, guid);
|
||||||
|
|
||||||
|
ret = db_pairing_add(&ri->pi);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_REMOTE, "Failed to register pairing!\n");
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
evhttp_connection_free(ri->evcon);
|
evhttp_connection_free(ri->evcon);
|
||||||
|
Loading…
Reference in New Issue
Block a user