summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--btif/include/btif_api.h17
-rw-r--r--btif/include/btif_storage.h12
-rw-r--r--btif/src/bluetooth.c14
-rw-r--r--btif/src/btif_config.c37
-rw-r--r--btif/src/btif_storage.c24
-rw-r--r--test/bluedroidtest/bluedroidtest.c2
-rw-r--r--test/suite/cases/adapter.c2
-rw-r--r--test/suite/main.c2
8 files changed, 105 insertions, 5 deletions
diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h
index 2e41d22..0861e54 100644
--- a/btif/include/btif_api.h
+++ b/btif/include/btif_api.h
@@ -87,6 +87,23 @@ bt_status_t btif_shutdown_bluetooth(void);
/*******************************************************************************
**
+** Function is_restricted_mode
+**
+** Description Checks if BT was enabled in restriced mode. In restricted
+** mode, bonds that are created are marked as temporary.
+** These bonds persist until we leave restricted mode, at
+** which point they will be deleted from the config. Also
+** while in restricted mode, the user can access devices
+** that are already paired before entering restricted mode,
+** but they cannot remove any of these devices.
+**
+** Returns bool
+**
+*******************************************************************************/
+bool is_restricted_mode(void);
+
+/*******************************************************************************
+**
** Function btif_get_adapter_properties
**
** Description Fetches all local adapter properties
diff --git a/btif/include/btif_storage.h b/btif/include/btif_storage.h
index f64c695..a7ba84e 100644
--- a/btif/include/btif_storage.h
+++ b/btif/include/btif_storage.h
@@ -314,6 +314,18 @@ bt_status_t btif_storage_add_device_to_autopair_blacklist(bt_bdaddr_t *remote_bd
*******************************************************************************/
BOOLEAN btif_storage_is_fixed_pin_zeros_keyboard(bt_bdaddr_t *remote_bd_addr);
+/*******************************************************************************
+**
+** Function btif_storage_is_retricted_device
+**
+** Description BTIF storage API - checks if this device is a restricted device
+**
+** Returns TRUE if the device is labled as restricted
+** FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN btif_storage_is_restricted_device(const bt_bdaddr_t *remote_bd_addr);
+
#if (BLE_INCLUDED == TRUE)
bt_status_t btif_storage_add_ble_bonding_key( bt_bdaddr_t *remote_bd_addr,
char *key,
diff --git a/btif/src/bluetooth.c b/btif/src/bluetooth.c
index 5c730f9..a1c3498 100644
--- a/btif/src/bluetooth.c
+++ b/btif/src/bluetooth.c
@@ -45,6 +45,7 @@
#include "btif_api.h"
#include "bt_utils.h"
+#include "btif_storage.h"
/************************************************************************************
** Constants & Macros
@@ -61,6 +62,7 @@
************************************************************************************/
bt_callbacks_t *bt_hal_cbacks = NULL;
+bool restricted_mode = FALSE;
/** Operating System specific callouts for resource management */
bt_os_callouts_t *bt_os_callouts = NULL;
@@ -142,10 +144,11 @@ static int init(bt_callbacks_t* callbacks )
return BT_STATUS_SUCCESS;
}
-static int enable( void )
-{
+static int enable(bool start_restricted) {
ALOGI("enable");
+ restricted_mode = start_restricted;
+
/* sanity check */
if (interface_ready() == FALSE)
return BT_STATUS_NOT_READY;
@@ -175,6 +178,10 @@ static void cleanup( void )
return;
}
+bool is_restricted_mode() {
+ return restricted_mode;
+}
+
static int get_adapter_properties(void)
{
/* sanity check */
@@ -285,6 +292,9 @@ static int cancel_bond(const bt_bdaddr_t *bd_addr)
static int remove_bond(const bt_bdaddr_t *bd_addr)
{
+ if (is_restricted_mode() && !btif_storage_is_restricted_device(bd_addr))
+ return BT_STATUS_SUCCESS;
+
/* sanity check */
if (interface_ready() == FALSE)
return BT_STATUS_NOT_READY;
diff --git a/btif/src/btif_config.c b/btif/src/btif_config.c
index 629f4c6..69f94b5 100644
--- a/btif/src/btif_config.c
+++ b/btif/src/btif_config.c
@@ -105,6 +105,7 @@ static int set_node(const char* section, const char* key, const char* name,
static int save_cfg();
static void load_cfg();
static short find_next_node(const cfg_node* p, short start, char* name, int* bytes);
+static void btif_config_remove_restricted();
#ifdef UNIT_TEST
static void cfg_test_load();
static void cfg_test_write();
@@ -148,6 +149,9 @@ int btif_config_init()
//cfg_test_read();
exit(0);
#endif
+
+ if (!is_restricted_mode())
+ btif_config_remove_restricted();
}
return pth >= 0;
}
@@ -989,3 +993,36 @@ static void cfg_test_read()
#endif
+
+static void btif_config_remove_restricted() {
+ int section_index = -1;
+ if ((section_index = find_inode(&root, "Remote")) < 0)
+ return;
+
+ cfg_node* remote_node = &root.child[section_index];
+ int count = GET_CHILD_COUNT(remote_node);
+ for (int i = 0; i < count; i ++) {
+ cfg_node* bdaddr_node = &remote_node->child[i];
+ if (find_inode(bdaddr_node, "Restricted") != -1) {
+ free_child(bdaddr_node, 0, GET_CHILD_COUNT(bdaddr_node));
+ free_child(remote_node, i, 1);
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/btif/src/btif_storage.c b/btif/src/btif_storage.c
index 5b1bf96..9427eb4 100644
--- a/btif/src/btif_storage.c
+++ b/btif/src/btif_storage.c
@@ -787,6 +787,13 @@ bt_status_t btif_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr,
int ret = btif_config_set_int("Remote", bdstr, "LinkKeyType", (int)key_type);
ret &= btif_config_set_int("Remote", bdstr, "PinLength", (int)pin_length);
ret &= btif_config_set("Remote", bdstr, "LinkKey", (const char*)link_key, sizeof(LINK_KEY), BTIF_CFG_TYPE_BIN);
+
+ if (is_restricted_mode()) {
+ BTIF_TRACE_WARNING("%s: '%s' pairing will be removed if unrestricted",
+ __func__, bdstr);
+ btif_config_set_int("Remote", bdstr, "Restricted", 1);
+ }
+
/* write bonded info immediately */
btif_config_flush();
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
@@ -1828,3 +1835,20 @@ BOOLEAN btif_storage_is_dmt_supported_device(const bt_bdaddr_t *remote_bd_addr)
}
+/*******************************************************************************
+**
+** Function btif_storage_is_restricted_device
+**
+** Description BTIF storage API - checks if this device is a restricted device
+**
+** Returns TRUE if the device is labeled as restricted
+** FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN btif_storage_is_restricted_device(const bt_bdaddr_t *remote_bd_addr)
+{
+ bdstr_t bdstr;
+ bd2str(remote_bd_addr, &bdstr);
+
+ return btif_config_exist("Remote", bdstr, "Restricted");
+}
diff --git a/test/bluedroidtest/bluedroidtest.c b/test/bluedroidtest/bluedroidtest.c
index ac727d8..022738a 100644
--- a/test/bluedroidtest/bluedroidtest.c
+++ b/test/bluedroidtest/bluedroidtest.c
@@ -560,7 +560,7 @@ void bdt_enable(void)
bdt_log("Bluetooth is already enabled");
return;
}
- status = sBtInterface->enable();
+ status = sBtInterface->enable(false);
check_return_status(status);
}
diff --git a/test/suite/cases/adapter.c b/test/suite/cases/adapter.c
index 492d8f4..6664c3b 100644
--- a/test/suite/cases/adapter.c
+++ b/test/suite/cases/adapter.c
@@ -24,7 +24,7 @@
bool adapter_enable_disable() {
int error;
- CALL_AND_WAIT(error = bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(error = bt_interface->enable(false), adapter_state_changed);
TASSERT(error == BT_STATUS_SUCCESS, "Error enabling Bluetooth: %d", error);
TASSERT(adapter_get_state() == BT_STATE_ON, "Adapter did not turn on.");
diff --git a/test/suite/main.c b/test/suite/main.c
index 7a3af5b..f09d8b4 100644
--- a/test/suite/main.c
+++ b/test/suite/main.c
@@ -89,7 +89,7 @@ int main(int argc, char **argv) {
// Run the full test suite.
for (size_t i = 0; i < test_suite_size; ++i) {
callbacks_init();
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
if (test_suite[i].function()) {
printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, test_suite[i].function_name, GREEN, GRAY);
++pass;