All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 1/3] shared/shell: fix missing stdbool in shell.h
@ 2021-08-06  9:38 Howard Chung
  2021-08-06  9:38 ` [PATCH v1 2/3] client: add service-allowlist command Howard Chung
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Howard Chung @ 2021-08-06  9:38 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz; +Cc: Yun-Hao Chung, Miao-chen Chou

From: Yun-Hao Chung <howardchung@chromium.org>

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

Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
---

 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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 2/3] client: add service-allowlist command
  2021-08-06  9:38 [PATCH v1 1/3] shared/shell: fix missing stdbool in shell.h Howard Chung
@ 2021-08-06  9:38 ` Howard Chung
  2021-08-06 21:41   ` Luiz Augusto von Dentz
  2021-08-06  9:38 ` [PATCH v1 3/3] client: add AffectedByPolicy property Howard Chung
  2021-08-06  9:58 ` [v1,1/3] shared/shell: fix missing stdbool in shell.h bluez.test.bot
  2 siblings, 1 reply; 5+ messages in thread
From: Howard Chung @ 2021-08-06  9:38 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz; +Cc: Yun-Hao Chung, Miao-chen Chou

From: Yun-Hao Chung <howardchung@chromium.org>

This creates a menu - admin and adds two commands to bluetoothctl
- set-service-allowlist [uuid1 uuid2 ...]
- get-service-allowlist

Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
---
The following test steps were performed:
1. [bluetooth]# - menu admin
2. [bluetooth]# set-service-allowlist 1124 180A 180F 1812 1801
3. [bluetooth]# get-service-allowlist
4. Verify the printed UUIDs are the same as what we set.

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

diff --git a/Makefile.tools b/Makefile.tools
index c836b5984934..1b493d4d0ed6 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_policy.h \
+					client/admin_policy.c
 client_bluetoothctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
 				$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
 endif
diff --git a/client/admin_policy.c b/client/admin_policy.c
new file mode 100644
index 000000000000..21062c4f6185
--- /dev/null
+++ b/client/admin_policy.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_policy.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_policy.h b/client/admin_policy.h
new file mode 100644
index 000000000000..1c8c2152d59d
--- /dev/null
+++ b/client/admin_policy.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..5297760c8cec 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_policy.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_set_service_allowlist(int argc, char *argv[])
+{
+	if (check_default_ctrl() == FALSE)
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+
+	admin_policy_set_service_allowlist(dbus_conn, argc - 1, argv + 1);
+}
+
+static void cmd_get_service_allowlist(int argc, char *argv[])
+{
+	if (check_default_ctrl() == FALSE)
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+
+	admin_policy_read_service_allowlist(dbus_conn);
+}
+
 static const struct bt_shell_menu advertise_menu = {
 	.name = "advertise",
 	.desc = "Advertise Options Submenu",
@@ -2978,6 +3037,18 @@ static const struct bt_shell_menu gatt_menu = {
 	{ } },
 };
 
+static const struct bt_shell_menu admin_menu = {
+	.name = "admin",
+	.desc = "Admin Policy Submenu",
+	.entries = {
+	{ "set-service-allowlist", "[uuid1 uuid2 ...]",
+						cmd_set_service_allowlist,
+						"Set service allowlist"},
+	{ "get-service-allowlist", NULL, cmd_get_service_allowlist,
+						"Get service allowlist"},
+	{} },
+};
+
 static const struct bt_shell_menu main_menu = {
 	.name = "main",
 	.entries = {
@@ -3075,6 +3146,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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 3/3] client: add AffectedByPolicy property
  2021-08-06  9:38 [PATCH v1 1/3] shared/shell: fix missing stdbool in shell.h Howard Chung
  2021-08-06  9:38 ` [PATCH v1 2/3] client: add service-allowlist command Howard Chung
@ 2021-08-06  9:38 ` Howard Chung
  2021-08-06  9:58 ` [v1,1/3] shared/shell: fix missing stdbool in shell.h bluez.test.bot
  2 siblings, 0 replies; 5+ messages in thread
From: Howard Chung @ 2021-08-06  9:38 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz; +Cc: Yun-Hao Chung, Miao-chen Chou

From: Yun-Hao Chung <howardchung@chromium.org>

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 <mcchou@chromium.org>
---
The following test steps were performed:
1. [bluetooth] menu admin
2. [bluetooth] set-service-allowlist 1124 180A 180F 1812 1801
3. Verify only HID devices are not `Affected by Policy`
4. [bluetooth] set-service-allowlist 1108 110A 110B 110C 110D 110E 110F
1112 111E 111F 1203
5. Verify only audio devices are not `Affected by Policy`
devices are expected.

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

diff --git a/client/main.c b/client/main.c
index 5297760c8cec..60ccee75a1e5 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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* RE: [v1,1/3] shared/shell: fix missing stdbool in shell.h
  2021-08-06  9:38 [PATCH v1 1/3] shared/shell: fix missing stdbool in shell.h Howard Chung
  2021-08-06  9:38 ` [PATCH v1 2/3] client: add service-allowlist command Howard Chung
  2021-08-06  9:38 ` [PATCH v1 3/3] client: add AffectedByPolicy property Howard Chung
@ 2021-08-06  9:58 ` bluez.test.bot
  2 siblings, 0 replies; 5+ messages in thread
From: bluez.test.bot @ 2021-08-06  9:58 UTC (permalink / raw)
  To: linux-bluetooth, howardchung

[-- Attachment #1: Type: text/plain, Size: 1953 bytes --]

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=527443

---Test result---

Test Summary:
CheckPatch                    PASS      1.05 seconds
GitLint                       PASS      0.35 seconds
Prep - Setup ELL              PASS      44.67 seconds
Build - Prep                  PASS      0.14 seconds
Build - Configure             PASS      7.81 seconds
Build - Make                  PASS      195.12 seconds
Make Check                    PASS      9.19 seconds
Make Distcheck                PASS      229.33 seconds
Build w/ext ELL - Configure   PASS      7.78 seconds
Build w/ext ELL - Make        PASS      176.58 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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v1 2/3] client: add service-allowlist command
  2021-08-06  9:38 ` [PATCH v1 2/3] client: add service-allowlist command Howard Chung
@ 2021-08-06 21:41   ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2021-08-06 21:41 UTC (permalink / raw)
  To: Howard Chung; +Cc: linux-bluetooth, Yun-Hao Chung, Miao-chen Chou

Hi Howard,

On Fri, Aug 6, 2021 at 2:38 AM Howard Chung <howardchung@google.com> wrote:
>
> From: Yun-Hao Chung <howardchung@chromium.org>
>
> This creates a menu - admin and adds two commands to bluetoothctl
> - set-service-allowlist [uuid1 uuid2 ...]
> - get-service-allowlist

How about we just do:

> allow [clear/uuid1 uuid2 ...]

So when no command is set it just prints the current list and in case
you want to clear it just enter allow clear.

> Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
> ---
> The following test steps were performed:
> 1. [bluetooth]# - menu admin
> 2. [bluetooth]# set-service-allowlist 1124 180A 180F 1812 1801
> 3. [bluetooth]# get-service-allowlist
> 4. Verify the printed UUIDs are the same as what we set.
>
>  Makefile.tools        |   4 +-
>  client/admin_policy.c | 133 ++++++++++++++++++++++++++++++++++++++++++
>  client/admin_policy.h |  25 ++++++++
>  client/main.c         |  72 +++++++++++++++++++++++
>  4 files changed, 233 insertions(+), 1 deletion(-)
>  create mode 100644 client/admin_policy.c
>  create mode 100644 client/admin_policy.h
>
> diff --git a/Makefile.tools b/Makefile.tools
> index c836b5984934..1b493d4d0ed6 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_policy.h \
> +                                       client/admin_policy.c
>  client_bluetoothctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
>                                 $(GLIB_LIBS) $(DBUS_LIBS) -lreadline
>  endif
> diff --git a/client/admin_policy.c b/client/admin_policy.c
> new file mode 100644
> index 000000000000..21062c4f6185
> --- /dev/null
> +++ b/client/admin_policy.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_policy.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_policy.h b/client/admin_policy.h
> new file mode 100644
> index 000000000000..1c8c2152d59d
> --- /dev/null
> +++ b/client/admin_policy.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..5297760c8cec 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_policy.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_set_service_allowlist(int argc, char *argv[])
> +{
> +       if (check_default_ctrl() == FALSE)
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +
> +       admin_policy_set_service_allowlist(dbus_conn, argc - 1, argv + 1);
> +}
> +
> +static void cmd_get_service_allowlist(int argc, char *argv[])
> +{
> +       if (check_default_ctrl() == FALSE)
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +
> +       admin_policy_read_service_allowlist(dbus_conn);
> +}
> +
>  static const struct bt_shell_menu advertise_menu = {
>         .name = "advertise",
>         .desc = "Advertise Options Submenu",
> @@ -2978,6 +3037,18 @@ static const struct bt_shell_menu gatt_menu = {
>         { } },
>  };
>
> +static const struct bt_shell_menu admin_menu = {
> +       .name = "admin",
> +       .desc = "Admin Policy Submenu",
> +       .entries = {
> +       { "set-service-allowlist", "[uuid1 uuid2 ...]",
> +                                               cmd_set_service_allowlist,
> +                                               "Set service allowlist"},
> +       { "get-service-allowlist", NULL, cmd_get_service_allowlist,
> +                                               "Get service allowlist"},
> +       {} },
> +};
> +
>  static const struct bt_shell_menu main_menu = {
>         .name = "main",
>         .entries = {
> @@ -3075,6 +3146,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
>


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-08-06 21:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-06  9:38 [PATCH v1 1/3] shared/shell: fix missing stdbool in shell.h Howard Chung
2021-08-06  9:38 ` [PATCH v1 2/3] client: add service-allowlist command Howard Chung
2021-08-06 21:41   ` Luiz Augusto von Dentz
2021-08-06  9:38 ` [PATCH v1 3/3] client: add AffectedByPolicy property Howard Chung
2021-08-06  9:58 ` [v1,1/3] shared/shell: fix missing stdbool in shell.h bluez.test.bot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.