1 /*
2 *
3 * BlueZ - Bluetooth protocol stack for Linux
4 *
5 * Copyright (C) 2006-2010 Nokia Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
7 *
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 */
24
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28
29 #define _GNU_SOURCE
30 #include <stdio.h>
31 #include <ctype.h>
32 #include <errno.h>
33 #include <unistd.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <sys/param.h>
37 #include <sys/ioctl.h>
38 #include <sys/socket.h>
39
40 #include <bluetooth/bluetooth.h>
41 #include <bluetooth/sdp.h>
42
43 #include <glib.h>
44 #include <dbus/dbus.h>
45 #include <gdbus.h>
46
47 #include "log.h"
48 #include "textfile.h"
49
50 #include "hcid.h"
51 #include "adapter.h"
52 #include "manager.h"
53 #include "device.h"
54 #include "error.h"
55 #include "glib-helper.h"
56 #include "dbus-common.h"
57 #include "agent.h"
58 #include "storage.h"
59 #include "event.h"
60 #include "sdpd.h"
61 #include "eir.h"
62
get_adapter_and_device(bdaddr_t * src,bdaddr_t * dst,struct btd_adapter ** adapter,struct btd_device ** device,gboolean create)63 static gboolean get_adapter_and_device(bdaddr_t *src, bdaddr_t *dst,
64 struct btd_adapter **adapter,
65 struct btd_device **device,
66 gboolean create)
67 {
68 DBusConnection *conn = get_dbus_connection();
69 char peer_addr[18];
70
71 *adapter = manager_find_adapter(src);
72 if (!*adapter) {
73 error("Unable to find matching adapter");
74 return FALSE;
75 }
76
77 ba2str(dst, peer_addr);
78
79 if (create)
80 *device = adapter_get_device(conn, *adapter, peer_addr);
81 else
82 *device = adapter_find_device(*adapter, peer_addr);
83
84 if (create && !*device) {
85 error("Unable to get device object!");
86 return FALSE;
87 }
88
89 return TRUE;
90 }
91
92 /*****************************************************************
93 *
94 * Section reserved to HCI commands confirmation handling and low
95 * level events(eg: device attached/dettached.
96 *
97 *****************************************************************/
98
decode_hex(const char * pin,char * out)99 static size_t decode_hex(const char *pin, char *out)
100 {
101 size_t i;
102
103 for (i = 0; i < 16 && pin[i * 2] && pin[i * 2 + 1]; i++)
104 sscanf(&pin[i * 2], "%02hhX", &out[i]);
105
106 return i;
107 }
108
decode_pin(const char * pin,char * out)109 static size_t decode_pin(const char *pin, char *out)
110 {
111 size_t len;
112
113 if (!pin)
114 return 0;
115
116 if (pin[0] == '$') {
117 len = decode_hex(&pin[1], out);
118 } else {
119 len = strnlen(pin, 16);
120 memcpy(out, pin, len);
121 }
122
123 return len;
124 }
125
pincode_cb(struct agent * agent,DBusError * derr,const char * pincode,struct btd_device * device)126 static void pincode_cb(struct agent *agent, DBusError *derr,
127 const char *pincode, struct btd_device *device)
128 {
129 struct btd_adapter *adapter = device_get_adapter(device);
130 bdaddr_t dba;
131 int err;
132 size_t len;
133 char rawpin[16];
134
135 device_get_address(device, &dba);
136
137 len = decode_pin(pincode, rawpin);
138 if (derr || !len) {
139 err = btd_adapter_pincode_reply(adapter, &dba, NULL, 0);
140 if (err < 0)
141 goto fail;
142 return;
143 }
144
145 err = btd_adapter_pincode_reply(adapter, &dba, rawpin, len);
146 if (err < 0)
147 goto fail;
148
149 return;
150
151 fail:
152 error("Sending PIN code reply failed: %s (%d)", strerror(-err), -err);
153 }
154
btd_event_request_pin(bdaddr_t * sba,bdaddr_t * dba)155 int btd_event_request_pin(bdaddr_t *sba, bdaddr_t *dba)
156 {
157 struct btd_adapter *adapter;
158 struct btd_device *device;
159 char pin[17];
160 int pinlen;
161
162 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
163 return -ENODEV;
164
165 memset(pin, 0, sizeof(pin));
166 pinlen = read_pin_code(sba, dba, pin);
167 if (pinlen > 0) {
168 btd_adapter_pincode_reply(adapter, dba, pin, pinlen);
169 return 0;
170 }
171
172 return device_request_authentication(device, AUTH_TYPE_PINCODE, 0,
173 pincode_cb);
174 }
175
confirm_reply(struct btd_adapter * adapter,struct btd_device * device,gboolean success)176 static int confirm_reply(struct btd_adapter *adapter,
177 struct btd_device *device, gboolean success)
178 {
179 bdaddr_t bdaddr;
180
181 device_get_address(device, &bdaddr);
182
183 return btd_adapter_confirm_reply(adapter, &bdaddr, success);
184 }
185
confirm_cb(struct agent * agent,DBusError * err,void * user_data)186 static void confirm_cb(struct agent *agent, DBusError *err, void *user_data)
187 {
188 struct btd_device *device = user_data;
189 struct btd_adapter *adapter = device_get_adapter(device);
190 gboolean success = (err == NULL) ? TRUE : FALSE;
191
192 confirm_reply(adapter, device, success);
193 }
194
passkey_cb(struct agent * agent,DBusError * err,uint32_t passkey,void * user_data)195 static void passkey_cb(struct agent *agent, DBusError *err, uint32_t passkey,
196 void *user_data)
197 {
198 struct btd_device *device = user_data;
199 struct btd_adapter *adapter = device_get_adapter(device);
200 bdaddr_t bdaddr;
201
202 device_get_address(device, &bdaddr);
203
204 if (err)
205 passkey = INVALID_PASSKEY;
206
207 btd_adapter_passkey_reply(adapter, &bdaddr, passkey);
208 }
209
btd_event_user_confirm(bdaddr_t * sba,bdaddr_t * dba,uint32_t passkey)210 int btd_event_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey)
211 {
212 struct btd_adapter *adapter;
213 struct btd_device *device;
214
215 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
216 return -ENODEV;
217
218 return device_request_authentication(device, AUTH_TYPE_CONFIRM,
219 passkey, confirm_cb);
220 }
221
btd_event_user_consent(bdaddr_t * sba,bdaddr_t * dba)222 int btd_event_user_consent(bdaddr_t *sba, bdaddr_t *dba)
223 {
224 struct btd_adapter *adapter;
225 struct btd_device *device;
226
227 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
228 return -ENODEV;
229
230 return device_request_authentication(device, AUTH_TYPE_PAIRING_CONSENT,
231 0, confirm_cb);
232 }
233
btd_event_user_passkey(bdaddr_t * sba,bdaddr_t * dba)234 int btd_event_user_passkey(bdaddr_t *sba, bdaddr_t *dba)
235 {
236 struct btd_adapter *adapter;
237 struct btd_device *device;
238
239 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
240 return -ENODEV;
241
242 return device_request_authentication(device, AUTH_TYPE_PASSKEY, 0,
243 passkey_cb);
244 }
245
btd_event_user_notify(bdaddr_t * sba,bdaddr_t * dba,uint32_t passkey)246 int btd_event_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey)
247 {
248 struct btd_adapter *adapter;
249 struct btd_device *device;
250
251 if (!get_adapter_and_device(sba, dba, &adapter, &device, TRUE))
252 return -ENODEV;
253
254 return device_request_authentication(device, AUTH_TYPE_NOTIFY,
255 passkey, NULL);
256 }
257
btd_event_bonding_complete(bdaddr_t * local,bdaddr_t * peer,uint8_t status)258 void btd_event_bonding_complete(bdaddr_t *local, bdaddr_t *peer,
259 uint8_t status)
260 {
261 struct btd_adapter *adapter;
262 struct btd_device *device;
263 gboolean create;
264
265 DBG("status 0x%02x", status);
266
267 create = status ? FALSE : TRUE;
268
269 if (!get_adapter_and_device(local, peer, &adapter, &device, create))
270 return;
271
272 if (device)
273 device_bonding_complete(device, status);
274 }
275
btd_event_simple_pairing_complete(bdaddr_t * local,bdaddr_t * peer,uint8_t status)276 void btd_event_simple_pairing_complete(bdaddr_t *local, bdaddr_t *peer,
277 uint8_t status)
278 {
279 struct btd_adapter *adapter;
280 struct btd_device *device;
281 gboolean create;
282
283 DBG("status=%02x", status);
284
285 create = status ? FALSE : TRUE;
286
287 if (!get_adapter_and_device(local, peer, &adapter, &device, create))
288 return;
289
290 if (!device)
291 return;
292
293 device_simple_pairing_complete(device, status);
294 }
295
update_lastseen(bdaddr_t * sba,bdaddr_t * dba)296 static void update_lastseen(bdaddr_t *sba, bdaddr_t *dba)
297 {
298 time_t t;
299 struct tm *tm;
300
301 t = time(NULL);
302 tm = gmtime(&t);
303
304 write_lastseen_info(sba, dba, tm);
305 }
306
update_lastused(bdaddr_t * sba,bdaddr_t * dba)307 static void update_lastused(bdaddr_t *sba, bdaddr_t *dba)
308 {
309 time_t t;
310 struct tm *tm;
311
312 t = time(NULL);
313 tm = gmtime(&t);
314
315 write_lastused_info(sba, dba, tm);
316 }
317
btd_event_device_found(bdaddr_t * local,bdaddr_t * peer,uint32_t class,int8_t rssi,uint8_t * data)318 void btd_event_device_found(bdaddr_t *local, bdaddr_t *peer, uint32_t class,
319 int8_t rssi, uint8_t *data)
320 {
321 struct btd_adapter *adapter;
322
323 adapter = manager_find_adapter(local);
324 if (!adapter) {
325 error("No matching adapter found");
326 return;
327 }
328
329 update_lastseen(local, peer);
330 write_remote_class(local, peer, class);
331
332 if (data)
333 write_remote_eir(local, peer, data);
334
335 adapter_update_found_devices(adapter, peer, class, rssi, data);
336 }
337
btd_event_set_legacy_pairing(bdaddr_t * local,bdaddr_t * peer,gboolean legacy)338 void btd_event_set_legacy_pairing(bdaddr_t *local, bdaddr_t *peer,
339 gboolean legacy)
340 {
341 struct btd_adapter *adapter;
342 struct remote_dev_info *dev, match;
343
344 adapter = manager_find_adapter(local);
345 if (!adapter) {
346 error("No matching adapter found");
347 return;
348 }
349
350 memset(&match, 0, sizeof(struct remote_dev_info));
351 bacpy(&match.bdaddr, peer);
352 match.name_status = NAME_ANY;
353
354 dev = adapter_search_found_devices(adapter, &match);
355 if (dev)
356 dev->legacy = legacy;
357 }
358
btd_event_remote_class(bdaddr_t * local,bdaddr_t * peer,uint32_t class)359 void btd_event_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class)
360 {
361 struct btd_adapter *adapter;
362 struct btd_device *device;
363 uint32_t old_class = 0;
364
365 read_remote_class(local, peer, &old_class);
366
367 if (old_class == class)
368 return;
369
370 write_remote_class(local, peer, class);
371
372 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
373 return;
374
375 if (!device)
376 return;
377
378 device_set_class(device, class);
379 }
380
btd_event_remote_name(bdaddr_t * local,bdaddr_t * peer,uint8_t status,char * name)381 void btd_event_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,
382 char *name)
383 {
384 struct btd_adapter *adapter;
385 char srcaddr[18], dstaddr[18];
386 struct btd_device *device;
387 struct remote_dev_info match, *dev_info;
388
389 if (status == 0) {
390 if (!g_utf8_validate(name, -1, NULL)) {
391 int i;
392
393 /* Assume ASCII, and replace all non-ASCII with
394 * spaces */
395 for (i = 0; name[i] != '\0'; i++) {
396 if (!isascii(name[i]))
397 name[i] = ' ';
398 }
399 /* Remove leading and trailing whitespace characters */
400 g_strstrip(name);
401 }
402
403 write_device_name(local, peer, name);
404 }
405
406 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
407 return;
408
409 ba2str(local, srcaddr);
410 ba2str(peer, dstaddr);
411
412 if (status != 0)
413 goto proceed;
414
415 bacpy(&match.bdaddr, peer);
416 match.name_status = NAME_ANY;
417
418 dev_info = adapter_search_found_devices(adapter, &match);
419 if (dev_info) {
420 g_free(dev_info->name);
421 dev_info->name = g_strdup(name);
422 adapter_emit_device_found(adapter, dev_info);
423 }
424
425 if (device)
426 device_set_name(device, name);
427
428 proceed:
429 /* remove from remote name request list */
430 adapter_remove_found_device(adapter, peer);
431
432 /* check if there is more devices to request names */
433 if (adapter_resolve_names(adapter) == 0)
434 return;
435
436 adapter_set_state(adapter, STATE_IDLE);
437 }
438
btd_event_link_key_notify(bdaddr_t * local,bdaddr_t * peer,uint8_t * key,uint8_t key_type,uint8_t pin_length)439 int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
440 uint8_t *key, uint8_t key_type,
441 uint8_t pin_length)
442 {
443 struct btd_adapter *adapter;
444 struct btd_device *device;
445 int ret;
446
447 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
448 return -ENODEV;
449
450 DBG("storing link key of type 0x%02x", key_type);
451
452 ret = write_link_key(local, peer, key, key_type, pin_length);
453
454 if (ret == 0) {
455 device_set_bonded(device, TRUE);
456
457 if (device_is_temporary(device))
458 device_set_temporary(device, FALSE);
459 }
460
461 return ret;
462 }
463
btd_event_conn_complete(bdaddr_t * local,bdaddr_t * peer)464 void btd_event_conn_complete(bdaddr_t *local, bdaddr_t *peer)
465 {
466 struct btd_adapter *adapter;
467 struct btd_device *device;
468
469 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
470 return;
471
472 update_lastused(local, peer);
473
474 adapter_add_connection(adapter, device);
475 }
476
btd_event_conn_failed(bdaddr_t * local,bdaddr_t * peer,uint8_t status)477 void btd_event_conn_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t status)
478 {
479 struct btd_adapter *adapter;
480 struct btd_device *device;
481 DBusConnection *conn = get_dbus_connection();
482
483 DBG("status 0x%02x", status);
484
485 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
486 return;
487
488 if (!device)
489 return;
490
491 if (device_is_temporary(device))
492 adapter_remove_device(conn, adapter, device, TRUE);
493 }
494
btd_event_disconn_complete(bdaddr_t * local,bdaddr_t * peer)495 void btd_event_disconn_complete(bdaddr_t *local, bdaddr_t *peer)
496 {
497 struct btd_adapter *adapter;
498 struct btd_device *device;
499
500 DBG("");
501
502 if (!get_adapter_and_device(local, peer, &adapter, &device, FALSE))
503 return;
504
505 if (!device)
506 return;
507
508 adapter_remove_connection(adapter, device);
509 }
510
511 /* Section reserved to device HCI callbacks */
512
btd_event_returned_link_key(bdaddr_t * local,bdaddr_t * peer)513 void btd_event_returned_link_key(bdaddr_t *local, bdaddr_t *peer)
514 {
515 struct btd_adapter *adapter;
516 struct btd_device *device;
517
518 if (!get_adapter_and_device(local, peer, &adapter, &device, TRUE))
519 return;
520
521 device_set_paired(device, TRUE);
522 }
523