2021-08-11 07:11:35

by Yun-hao Chung

[permalink] [raw]
Subject: [PATCH v3 1/3] shared/shell: fix missing stdbool in shell.h

From: Yun-Hao Chung <[email protected]>

bt_shell_menu_exists_t returns bool, but stdbool.h is not included.

Reviewed-by: Miao-chen Chou <[email protected]>
---

Changes in v3:
- Rename client/admin_policy.* to client/admin.*

Changes in v2:
- refactor command to |allow| instead of |set-service-allowlist| and
|get-service-allowlist|

src/shared/shell.h | 1 +
1 file changed, 1 insertion(+)

diff --git a/src/shared/shell.h b/src/shared/shell.h
index 415194a40736..cc4f822fbf1d 100644
--- a/src/shared/shell.h
+++ b/src/shared/shell.h
@@ -8,6 +8,7 @@
*
*/
#include <getopt.h>
+#include <stdbool.h>

#define COLOR_OFF "\001\x1B[0m\002"
#define COLOR_RED "\001\x1B[0;91m\002"
--
2.32.0.605.g8dce9f2422-goog


2021-08-11 07:11:35

by Yun-hao Chung

[permalink] [raw]
Subject: [PATCH v3 2/3] client: add admin submenu and allow command

From: Yun-Hao Chung <[email protected]>

This creates a menu - admin and add a commands to bluetoothctl
- allow [clear/uuid1 uuid2 ...]

Reviewed-by: Miao-chen Chou <[email protected]>
---
The following test steps were performed:
1. [bluetooth]# menu admin
2. [bluetooth]# allow 1124 180A 180F 1812 1801
3. [bluetooth]# allow
Service AllowedList:
00001801-0000-1000-8000-00805f9b34fb
00001812-0000-1000-8000-00805f9b34fb
0000180f-0000-1000-8000-00805f9b34fb
0000180a-0000-1000-8000-00805f9b34fb
00001124-0000-1000-8000-00805f9b34fb
4. [bluetooth]# allow clear
5. [bluetooth]# allow
Service AllowedList:

Changes in v3:
- Rename client/admin_policy.* -> client/admin.*
- Remove a line added by mistake in cmd_admin_allow

Changes in v2:
- Merge command set-service-allowlist and get-service-allowlist to allow
- Update commit messages

Makefile.tools | 4 +-
client/admin.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++
client/admin.h | 25 ++++++++++
client/main.c | 69 +++++++++++++++++++++++++
4 files changed, 230 insertions(+), 1 deletion(-)
create mode 100644 client/admin.c
create mode 100644 client/admin.h

diff --git a/Makefile.tools b/Makefile.tools
index c836b5984934..8cfaf8972150 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -9,7 +9,9 @@ client_bluetoothctl_SOURCES = client/main.c \
client/advertising.c \
client/adv_monitor.h \
client/adv_monitor.c \
- client/gatt.h client/gatt.c
+ client/gatt.h client/gatt.c \
+ client/admin.h \
+ client/admin.c
client_bluetoothctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
endif
diff --git a/client/admin.c b/client/admin.c
new file mode 100644
index 000000000000..863590172428
--- /dev/null
+++ b/client/admin.c
@@ -0,0 +1,133 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2021 Google LLC
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "gdbus/gdbus.h"
+#include "src/shared/shell.h"
+
+#include "admin.h"
+#define _GNU_SOURCE
+
+static GDBusProxy *set_proxy;
+static GDBusProxy *status_proxy;
+
+void admin_policy_set_set_proxy(GDBusProxy *proxy)
+{
+ set_proxy = proxy;
+}
+
+void admin_policy_set_status_proxy(GDBusProxy *proxy)
+{
+ status_proxy = proxy;
+}
+
+void admin_policy_read_service_allowlist(DBusConnection *dbus_conn)
+{
+ DBusMessageIter iter, subiter;
+ char *uuid = NULL;
+
+ if (!status_proxy || !g_dbus_proxy_get_property(status_proxy,
+ "ServiceAllowList", &iter)) {
+ bt_shell_printf("Failed to get property\n");
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
+ bt_shell_printf("Unexpected return type\n");
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+
+ bt_shell_printf("Service AllowedList:\n");
+ dbus_message_iter_recurse(&iter, &subiter);
+ while (dbus_message_iter_get_arg_type(&subiter) ==
+ DBUS_TYPE_STRING) {
+ dbus_message_iter_get_basic(&subiter, &uuid);
+ bt_shell_printf("\t%s\n", uuid);
+ dbus_message_iter_next(&subiter);
+ }
+
+ return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+struct uuid_list_data {
+ char **uuid_list;
+ size_t num;
+};
+
+static void set_service_setup(DBusMessageIter *iter, void *user_data)
+{
+ struct uuid_list_data *data = user_data;
+ DBusMessageIter arr_iter;
+ size_t i;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_STRING_AS_STRING,
+ &arr_iter);
+
+ for (i = 0; i < data->num; i++) {
+ dbus_message_iter_append_basic(&arr_iter, DBUS_TYPE_STRING,
+ &data->uuid_list[i]);
+ }
+
+ dbus_message_iter_close_container(iter, &arr_iter);
+}
+
+static void set_service_reply(DBusMessage *message, void *user_data)
+{
+ DBusError error;
+
+ dbus_error_init(&error);
+
+ if (!dbus_set_error_from_message(&error, message)) {
+ bt_shell_printf("Set allowed service successfully\n");
+ return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+ }
+
+ bt_shell_printf("Failed to set service allowed list: %s\n", error.name);
+ dbus_error_free(&error);
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+}
+
+void admin_policy_set_service_allowlist(DBusConnection *dbus_connd,
+ int argc, char *argv[])
+{
+ struct uuid_list_data data;
+
+ if (!set_proxy) {
+ bt_shell_printf("Set proxy not ready\n");
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+
+ data.uuid_list = argv;
+ data.num = argc;
+
+ if (!g_dbus_proxy_method_call(set_proxy, "SetServiceAllowList",
+ set_service_setup, set_service_reply,
+ &data, NULL)) {
+ bt_shell_printf("Failed to call method\n");
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+}
diff --git a/client/admin.h b/client/admin.h
new file mode 100644
index 000000000000..1c8c2152d59d
--- /dev/null
+++ b/client/admin.h
@@ -0,0 +1,25 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2021 Google LLC
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+void admin_policy_set_set_proxy(GDBusProxy *proxy);
+void admin_policy_set_status_proxy(GDBusProxy *proxy);
+
+void admin_policy_read_service_allowlist(DBusConnection *dbus_conn);
+void admin_policy_set_service_allowlist(DBusConnection *dbus_conn,
+ int argc, char *argv[]);
diff --git a/client/main.c b/client/main.c
index c1a62edb7f99..a983066eda34 100644
--- a/client/main.c
+++ b/client/main.c
@@ -29,6 +29,7 @@
#include "gatt.h"
#include "advertising.h"
#include "adv_monitor.h"
+#include "admin.h"

/* String display constants */
#define COLORED_NEW COLOR_GREEN "NEW" COLOR_OFF
@@ -530,6 +531,23 @@ static void admon_manager_added(GDBusProxy *proxy)
adv_monitor_register_app(dbus_conn);
}

+static void admin_policy_set_added(GDBusProxy *proxy)
+{
+ admin_policy_set_set_proxy(proxy);
+}
+
+static void admin_policy_status_added(GDBusProxy *proxy)
+{
+ struct adapter *adapter;
+
+ adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));
+
+ if (!adapter)
+ return;
+
+ admin_policy_set_status_proxy(proxy);
+}
+
static void proxy_added(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -565,6 +583,10 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
} else if (!strcmp(interface,
"org.bluez.AdvertisementMonitorManager1")) {
admon_manager_added(proxy);
+ } else if (!strcmp(interface, "org.bluez.AdminPolicySet1")) {
+ admin_policy_set_added(proxy);
+ } else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1")) {
+ admin_policy_status_added(proxy);
}
}

@@ -621,6 +643,23 @@ static void adapter_removed(GDBusProxy *proxy)
}
}

+static void admin_policy_set_removed(GDBusProxy *proxy)
+{
+ admin_policy_set_set_proxy(NULL);
+}
+
+static void admin_policy_status_removed(GDBusProxy *proxy)
+{
+ struct adapter *adapter;
+
+ adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));
+
+ if (!adapter)
+ return;
+
+ admin_policy_set_status_proxy(NULL);
+}
+
static void proxy_removed(GDBusProxy *proxy, void *user_data)
{
const char *interface;
@@ -661,6 +700,10 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
} else if (!strcmp(interface,
"org.bluez.AdvertisementMonitorManager1")) {
adv_monitor_remove_manager(dbus_conn);
+ } else if (!strcmp(interface, "org.bluez.AdminPolicySet1")) {
+ admin_policy_set_removed(proxy);
+ } else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1")) {
+ admin_policy_status_removed(proxy);
}
}

@@ -2824,6 +2867,22 @@ static void cmd_adv_monitor_get_supported_info(int argc, char *argv[])
adv_monitor_get_supported_info();
}

+static void cmd_admin_allow(int argc, char *argv[])
+{
+ if (check_default_ctrl() == FALSE)
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+
+ if (argc <= 1) {
+ admin_policy_read_service_allowlist(dbus_conn);
+ return;
+ }
+
+ if (strcmp(argv[1], "clear") == 0)
+ argc--;
+
+ admin_policy_set_service_allowlist(dbus_conn, argc - 1, argv + 1);
+}
+
static const struct bt_shell_menu advertise_menu = {
.name = "advertise",
.desc = "Advertise Options Submenu",
@@ -2978,6 +3037,15 @@ static const struct bt_shell_menu gatt_menu = {
{ } },
};

+static const struct bt_shell_menu admin_menu = {
+ .name = "admin",
+ .desc = "Admin Policy Submenu",
+ .entries = {
+ { "allow", "[clear/uuid1 uuid2 ...]", cmd_admin_allow,
+ "Allow service UUIDs and block rest of them"},
+ {} },
+};
+
static const struct bt_shell_menu main_menu = {
.name = "main",
.entries = {
@@ -3075,6 +3143,7 @@ int main(int argc, char *argv[])
bt_shell_add_submenu(&advertise_monitor_menu);
bt_shell_add_submenu(&scan_menu);
bt_shell_add_submenu(&gatt_menu);
+ bt_shell_add_submenu(&admin_menu);
bt_shell_set_prompt(PROMPT_OFF);

if (agent_option)
--
2.32.0.605.g8dce9f2422-goog

2021-08-11 07:13:04

by Yun-hao Chung

[permalink] [raw]
Subject: [PATCH v3 3/3] client: add AffectedByPolicy property

From: Yun-Hao Chung <[email protected]>

This prints property AffectedByPolicy in device info if
org.bluez.AdminPolicyStatus1 exists.

This also rename find_battery_by_path to find_proxies_by_path to reuse
the function.

Reviewed-by: Miao-chen Chou <[email protected]>
---
The following test steps were performed:
1. [bluetooth] menu admin
2. [bluetooth] allow 1124 180A 180F 1812 1801
3. Verify only HID devices are not `Affected by Policy`
4. [bluetooth] allow 1108 110A 110B 110C 110D 110E 110F
1112 111E 111F 1203
5. Verify only audio devices are not `Affected by Policy`
devices are expected.

(no changes since v1)

client/main.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/client/main.c b/client/main.c
index a983066eda34..506602bbdb6d 100644
--- a/client/main.c
+++ b/client/main.c
@@ -56,6 +56,7 @@ static GDBusProxy *default_dev;
static GDBusProxy *default_attr;
static GList *ctrl_list;
static GList *battery_proxies;
+static GList *admin_devices_proxies;

static const char *agent_arguments[] = {
"on",
@@ -542,8 +543,11 @@ static void admin_policy_status_added(GDBusProxy *proxy)

adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));

- if (!adapter)
+ if (!adapter) {
+ admin_devices_proxies = g_list_append(admin_devices_proxies,
+ proxy);
return;
+ }

admin_policy_set_status_proxy(proxy);
}
@@ -654,8 +658,11 @@ static void admin_policy_status_removed(GDBusProxy *proxy)

adapter = find_ctrl(ctrl_list, g_dbus_proxy_get_path(proxy));

- if (!adapter)
+ if (!adapter) {
+ admin_devices_proxies = g_list_remove(admin_devices_proxies,
+ proxy);
return;
+ }

admin_policy_set_status_proxy(NULL);
}
@@ -837,7 +844,7 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
return NULL;
}

-static GDBusProxy *find_battery_by_path(GList *source, const char *path)
+static GDBusProxy *find_proxies_by_path(GList *source, const char *path)
{
GList *list;

@@ -1704,6 +1711,7 @@ static struct GDBusProxy *find_device(int argc, char *argv[])
static void cmd_info(int argc, char *argv[])
{
GDBusProxy *proxy;
+ GDBusProxy *admin_proxy;
GDBusProxy *battery_proxy;
DBusMessageIter iter;
const char *address;
@@ -1747,10 +1755,14 @@ static void cmd_info(int argc, char *argv[])
print_property(proxy, "AdvertisingFlags");
print_property(proxy, "AdvertisingData");

- battery_proxy = find_battery_by_path(battery_proxies,
+ battery_proxy = find_proxies_by_path(battery_proxies,
+ g_dbus_proxy_get_path(proxy));
+ admin_proxy = find_proxies_by_path(admin_devices_proxies,
g_dbus_proxy_get_path(proxy));
print_property_with_label(battery_proxy, "Percentage",
"Battery Percentage");
+ print_property_with_label(admin_proxy, "AffectedByPolicy",
+ "Affected by Policy");

return bt_shell_noninteractive_quit(EXIT_SUCCESS);
}
--
2.32.0.605.g8dce9f2422-goog

2021-08-11 07:35:25

by bluez.test.bot

[permalink] [raw]
Subject: RE: [v3,1/3] shared/shell: fix missing stdbool in shell.h

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=529629

---Test result---

Test Summary:
CheckPatch PASS 0.88 seconds
GitLint PASS 0.30 seconds
Prep - Setup ELL PASS 39.82 seconds
Build - Prep PASS 0.10 seconds
Build - Configure PASS 6.97 seconds
Build - Make PASS 172.65 seconds
Make Check PASS 9.56 seconds
Make Distcheck PASS 204.28 seconds
Build w/ext ELL - Configure PASS 7.09 seconds
Build w/ext ELL - Make PASS 163.00 seconds

Details
##############################
Test: CheckPatch - PASS
Desc: Run checkpatch.pl script with rule in .checkpatch.conf

##############################
Test: GitLint - PASS
Desc: Run gitlint with rule in .gitlint

##############################
Test: Prep - Setup ELL - PASS
Desc: Clone, build, and install ELL

##############################
Test: Build - Prep - PASS
Desc: Prepare environment for build

##############################
Test: Build - Configure - PASS
Desc: Configure the BlueZ source tree

##############################
Test: Build - Make - PASS
Desc: Build the BlueZ source tree

##############################
Test: Make Check - PASS
Desc: Run 'make check'

##############################
Test: Make Distcheck - PASS
Desc: Run distcheck to check the distribution

##############################
Test: Build w/ext ELL - Configure - PASS
Desc: Configure BlueZ source with '--enable-external-ell' configuration

##############################
Test: Build w/ext ELL - Make - PASS
Desc: Build BlueZ source with '--enable-external-ell' configuration



---
Regards,
Linux Bluetooth

2021-08-11 18:25:40

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [v3,1/3] shared/shell: fix missing stdbool in shell.h

Hi Howard,

On Wed, Aug 11, 2021 at 12:35 AM <[email protected]> wrote:
>
> This is automated email and please do not reply to this email!
>
> Dear submitter,
>
> Thank you for submitting the patches to the linux bluetooth mailing list.
> This is a CI test results with your patch series:
> PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=529629
>
> ---Test result---
>
> Test Summary:
> CheckPatch PASS 0.88 seconds
> GitLint PASS 0.30 seconds
> Prep - Setup ELL PASS 39.82 seconds
> Build - Prep PASS 0.10 seconds
> Build - Configure PASS 6.97 seconds
> Build - Make PASS 172.65 seconds
> Make Check PASS 9.56 seconds
> Make Distcheck PASS 204.28 seconds
> Build w/ext ELL - Configure PASS 7.09 seconds
> Build w/ext ELL - Make PASS 163.00 seconds
>
> Details
> ##############################
> Test: CheckPatch - PASS
> Desc: Run checkpatch.pl script with rule in .checkpatch.conf
>
> ##############################
> Test: GitLint - PASS
> Desc: Run gitlint with rule in .gitlint
>
> ##############################
> Test: Prep - Setup ELL - PASS
> Desc: Clone, build, and install ELL
>
> ##############################
> Test: Build - Prep - PASS
> Desc: Prepare environment for build
>
> ##############################
> Test: Build - Configure - PASS
> Desc: Configure the BlueZ source tree
>
> ##############################
> Test: Build - Make - PASS
> Desc: Build the BlueZ source tree
>
> ##############################
> Test: Make Check - PASS
> Desc: Run 'make check'
>
> ##############################
> Test: Make Distcheck - PASS
> Desc: Run distcheck to check the distribution
>
> ##############################
> Test: Build w/ext ELL - Configure - PASS
> Desc: Configure BlueZ source with '--enable-external-ell' configuration
>
> ##############################
> Test: Build w/ext ELL - Make - PASS
> Desc: Build BlueZ source with '--enable-external-ell' configuration
>
>
>
> ---
> Regards,
> Linux Bluetooth

Applied, thanks.

--
Luiz Augusto von Dentz