linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t
@ 2014-05-26  9:10 Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 2/6] shared/gatt: Add helper for getting attribute's permissions Marcin Kraglak
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

---
 src/shared/gatt-db.c | 6 +++---
 src/shared/gatt-db.h | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
index 36316af..90c09bb 100644
--- a/src/shared/gatt-db.c
+++ b/src/shared/gatt-db.c
@@ -48,7 +48,7 @@ struct gatt_db {
 struct gatt_db_attribute {
 	uint16_t handle;
 	bt_uuid_t uuid;
-	uint8_t permissions;
+	uint32_t permissions;
 	uint16_t value_len;
 	uint8_t *value;
 
@@ -269,7 +269,7 @@ static void set_attribute_data(struct gatt_db_attribute *attribute,
 
 uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
 						const bt_uuid_t *uuid,
-						uint8_t permissions,
+						uint32_t permissions,
 						uint8_t properties,
 						gatt_db_read_t read_func,
 						gatt_db_write_t write_func,
@@ -317,7 +317,7 @@ uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
 
 uint16_t gatt_db_add_char_descriptor(struct gatt_db *db, uint16_t handle,
 						const bt_uuid_t *uuid,
-						uint8_t permissions,
+						uint32_t permissions,
 						gatt_db_read_t read_func,
 						gatt_db_write_t write_func,
 						void *user_data)
diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
index 3d46730..350e34e 100644
--- a/src/shared/gatt-db.h
+++ b/src/shared/gatt-db.h
@@ -41,7 +41,7 @@ typedef void (*gatt_db_write_t) (uint16_t handle, uint16_t offset,
 
 uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
 						const bt_uuid_t *uuid,
-						uint8_t permissions,
+						uint32_t permissions,
 						uint8_t properties,
 						gatt_db_read_t read_func,
 						gatt_db_write_t write_func,
@@ -49,7 +49,7 @@ uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
 
 uint16_t gatt_db_add_char_descriptor(struct gatt_db *db, uint16_t handle,
 						const bt_uuid_t *uuid,
-						uint8_t permissions,
+						uint32_t permissions,
 						gatt_db_read_t read_func,
 						gatt_db_write_t write_func,
 						void *user_data);
-- 
1.9.0


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

* [PATCHv2 2/6] shared/gatt: Add helper for getting attribute's permissions
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
@ 2014-05-26  9:10 ` Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 3/6] android/hal-gatt: Define attribute permissions values Marcin Kraglak
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

It will return attribute's permissions or 0 if attribute was not found.
---
 src/shared/gatt-db.c | 25 +++++++++++++++++++++++++
 src/shared/gatt-db.h |  2 ++
 2 files changed, 27 insertions(+)

diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
index 90c09bb..d6f3143 100644
--- a/src/shared/gatt-db.c
+++ b/src/shared/gatt-db.c
@@ -733,3 +733,28 @@ uint16_t gatt_db_get_end_handle(struct gatt_db *db, uint16_t handle)
 
 	return service->attributes[0]->handle + service->num_handles - 1;
 }
+
+uint32_t gatt_db_get_attribute_permissions(struct gatt_db *db, uint16_t handle)
+{
+	struct gatt_db_attribute *attribute;
+	struct gatt_db_service *service;
+	uint16_t service_handle;
+
+	service = queue_find(db->services, find_service_for_handle,
+							INT_TO_PTR(handle));
+	if (!service)
+		return 0;
+
+	service_handle = service->attributes[0]->handle;
+
+	/*
+	 * We can safely get attribute from attributes array with offset,
+	 * because find_service_for_handle() check if given handle is
+	 * in service range.
+	 */
+	attribute = service->attributes[handle - service_handle];
+	if (!attribute)
+		return 0;
+
+	return attribute->permissions;
+}
diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
index 350e34e..f2f2f4d 100644
--- a/src/shared/gatt-db.h
+++ b/src/shared/gatt-db.h
@@ -91,3 +91,5 @@ const bt_uuid_t *gatt_db_get_attribute_type(struct gatt_db *db,
 							uint16_t handle);
 
 uint16_t gatt_db_get_end_handle(struct gatt_db *db, uint16_t handle);
+
+uint32_t gatt_db_get_attribute_permissions(struct gatt_db *db, uint16_t handle);
-- 
1.9.0


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

* [PATCHv2 3/6] android/hal-gatt: Define attribute permissions values
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 2/6] shared/gatt: Add helper for getting attribute's permissions Marcin Kraglak
@ 2014-05-26  9:10 ` Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 4/6] android/gatt: Store proper attributes permissions in database Marcin Kraglak
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

These values are defined in Android and should be used on daemon
side.
---
 android/hal-msg.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/android/hal-msg.h b/android/hal-msg.h
index 09bd9a0..b68a4c7 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -1590,3 +1590,12 @@ struct hal_ev_gatt_server_rsp_confirmation {
 	int32_t status;
 	int32_t handle;
 } __attribute__((packed));
+
+#define HAL_GATT_PERMISSION_READ			0x0001
+#define HAL_GATT_PERMISSION_READ_ENCRYPTED		0x0002
+#define HAL_GATT_PERMISSION_READ_ENCRYPTED_MITM		0x0004
+#define HAL_GATT_PERMISSION_WRITE			0x0010
+#define HAL_GATT_PERMISSION_WRITE_ENCRYPTED		0x0020
+#define HAL_GATT_PERMISSION_WRITE_ENCRYPTED_MITM	0x0040
+#define HAL_GATT_PERMISSION_WRITE_SIGNED		0x0080
+#define HAL_GATT_PERMISSION_WRITE_SIGNED_MITM		0x0100
-- 
1.9.0


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

* [PATCHv2 4/6] android/gatt: Store proper attributes permissions in database
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 2/6] shared/gatt: Add helper for getting attribute's permissions Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 3/6] android/hal-gatt: Define attribute permissions values Marcin Kraglak
@ 2014-05-26  9:10 ` Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 5/6] android/gatt: Add proper permissions to built-in services Marcin Kraglak
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

Convert Android HAL permissions to GATT server permissions and store
them in database.
---
 android/gatt.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 51 insertions(+), 4 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index 70cd5fe..bfcbb62 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -57,6 +57,17 @@
 
 #define BASE_UUID16_OFFSET     12
 
+#define GATT_PERM_READ			0x00000001
+#define GATT_PERM_READ_ENCRYPTED	0x00000002
+#define GATT_PERM_READ_MITM		0x00000004
+#define GATT_PERM_READ_AUTHORIZATION	0x00000008
+#define GATT_PERM_WRITE			0x00000100
+#define GATT_PERM_WRITE_ENCRYPTED	0x00000200
+#define GATT_PERM_WRITE_MITM		0x00000400
+#define GATT_PERM_WRITE_AUTHORIZATION	0x00000800
+#define GATT_PERM_WRITE_SIGNED		0x00010000
+#define GATT_PERM_WRITE_SIGNED_MITM	0x00020000
+
 static const uint8_t BLUETOOTH_UUID[] = {
 	0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
 	0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
@@ -4013,6 +4024,40 @@ failed:
 								bdaddr);
 }
 
+static uint32_t android_to_gatt_permissions(int32_t hal_permissions)
+{
+	uint32_t permissions = 0;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_READ)
+		permissions |= GATT_PERM_READ;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_READ_ENCRYPTED)
+		permissions |= GATT_PERM_READ_ENCRYPTED | GATT_PERM_READ;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_READ_ENCRYPTED_MITM)
+		permissions |= GATT_PERM_READ_MITM | GATT_PERM_READ_ENCRYPTED |
+								GATT_PERM_READ;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_WRITE)
+		permissions |= GATT_PERM_WRITE;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_WRITE_ENCRYPTED)
+		permissions |= GATT_PERM_WRITE_ENCRYPTED | GATT_PERM_WRITE;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_WRITE_ENCRYPTED_MITM)
+		permissions |= GATT_PERM_WRITE_MITM |
+				GATT_PERM_WRITE_ENCRYPTED | GATT_PERM_WRITE;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_WRITE_SIGNED)
+		permissions |= GATT_PERM_WRITE_SIGNED;
+
+	if (hal_permissions & HAL_GATT_PERMISSION_WRITE_SIGNED_MITM)
+		permissions |= GATT_PERM_WRITE_SIGNED_MITM |
+							GATT_PERM_WRITE_SIGNED;
+
+	return permissions;
+}
+
 static void handle_server_add_characteristic(const void *buf, uint16_t len)
 {
 	const struct hal_cmd_gatt_server_add_characteristic *cmd = buf;
@@ -4020,6 +4065,7 @@ static void handle_server_add_characteristic(const void *buf, uint16_t len)
 	struct gatt_app *server;
 	bt_uuid_t uuid;
 	uint8_t status;
+	uint32_t permissions;
 	int32_t app_id = cmd->server_if;
 
 	DBG("");
@@ -4033,11 +4079,11 @@ static void handle_server_add_characteristic(const void *buf, uint16_t len)
 	}
 
 	android2uuid(cmd->uuid, &uuid);
+	permissions = android_to_gatt_permissions(cmd->permissions);
 
-	/*FIXME: Handle properties. Register callback if needed. */
 	ev.char_handle = gatt_db_add_characteristic(gatt_db,
 							cmd->service_handle,
-							&uuid, cmd->permissions,
+							&uuid, permissions,
 							cmd->properties,
 							read_cb, write_cb,
 							INT_TO_PTR(app_id));
@@ -4067,6 +4113,7 @@ static void handle_server_add_descriptor(const void *buf, uint16_t len)
 	struct gatt_app *server;
 	bt_uuid_t uuid;
 	uint8_t status;
+	uint32_t permissions;
 	int32_t app_id = cmd->server_if;
 
 	DBG("");
@@ -4080,11 +4127,11 @@ static void handle_server_add_descriptor(const void *buf, uint16_t len)
 	}
 
 	android2uuid(cmd->uuid, &uuid);
+	permissions = android_to_gatt_permissions(cmd->permissions);
 
-	/*FIXME: Handle properties. Register callback if needed. */
 	ev.descr_handle = gatt_db_add_char_descriptor(gatt_db,
 							cmd->service_handle,
-							&uuid, cmd->permissions,
+							&uuid, permissions,
 							read_cb, write_cb,
 							INT_TO_PTR(app_id));
 	if (!ev.descr_handle)
-- 
1.9.0


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

* [PATCHv2 5/6] android/gatt: Add proper permissions to built-in services
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
                   ` (2 preceding siblings ...)
  2014-05-26  9:10 ` [PATCHv2 4/6] android/gatt: Store proper attributes permissions in database Marcin Kraglak
@ 2014-05-26  9:10 ` Marcin Kraglak
  2014-05-26  9:10 ` [PATCHv2 6/6] android/gatt: Check permissions before read execution Marcin Kraglak
  2014-05-26 12:19 ` [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Szymon Janc
  5 siblings, 0 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

Set permissions to built in services.
---
 android/gatt.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/android/gatt.c b/android/gatt.c
index bfcbb62..cde8816 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -5078,7 +5078,7 @@ static void register_gap_service(void)
 	bt_uuid16_create(&uuid, GATT_CHARAC_DEVICE_NAME);
 	gap_srvc_data.dev_name =
 			gatt_db_add_characteristic(gatt_db, gap_srvc_data.srvc,
-							&uuid, 0,
+							&uuid, GATT_PERM_READ,
 							GATT_CHR_PROP_READ,
 							gap_read_cb, NULL,
 							NULL);
@@ -5087,7 +5087,7 @@ static void register_gap_service(void)
 	bt_uuid16_create(&uuid, GATT_CHARAC_APPEARANCE);
 	gap_srvc_data.appear =
 			gatt_db_add_characteristic(gatt_db, gap_srvc_data.srvc,
-							&uuid, 0,
+							&uuid, GATT_PERM_READ,
 							GATT_CHR_PROP_READ,
 							gap_read_cb, NULL,
 							NULL);
@@ -5096,7 +5096,7 @@ static void register_gap_service(void)
 	bt_uuid16_create(&uuid, GATT_CHARAC_PERIPHERAL_PRIV_FLAG);
 	gap_srvc_data.priv =
 			gatt_db_add_characteristic(gatt_db, gap_srvc_data.srvc,
-							&uuid, 0,
+							&uuid, GATT_PERM_READ,
 							GATT_CHR_PROP_READ,
 							gap_read_cb, NULL,
 							NULL);
@@ -5169,43 +5169,43 @@ static void register_device_info_service(void)
 
 	/* User data are not const hence (void *) cast is used */
 	bt_uuid16_create(&uuid, GATT_CHARAC_SYSTEM_ID);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.system_id);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_MODEL_NUMBER_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.model_number);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_SERIAL_NUMBER_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.serial_number);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_FIRMWARE_REVISION_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.firmware_rev);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_HARDWARE_REVISION_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.hardware_rev);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_SOFTWARE_REVISION_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.software_rev);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_MANUFACTURER_NAME_STRING);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_READ,
 					device_info_read_cb, NULL,
 					(void *) device_info.manufacturer_name);
@@ -5250,13 +5250,14 @@ static void register_gatt_service(void)
 	srvc_handle = gatt_db_add_service(gatt_db, &uuid, true, 4);
 
 	bt_uuid16_create(&uuid, GATT_CHARAC_SERVICE_CHANGED);
-	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, 0,
+	gatt_db_add_characteristic(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
 					GATT_CHR_PROP_INDICATE, NULL, NULL,
 					NULL);
 
 	bt_uuid16_create(&uuid, GATT_CLIENT_CHARAC_CFG_UUID);
-	gatt_db_add_char_descriptor(gatt_db, srvc_handle, &uuid, 0, NULL,
-					gatt_srvc_change_register_cb, NULL);
+	gatt_db_add_char_descriptor(gatt_db, srvc_handle, &uuid, GATT_PERM_READ,
+					NULL, gatt_srvc_change_register_cb,
+					NULL);
 
 	gatt_db_service_set_active(gatt_db, srvc_handle, true);
 }
-- 
1.9.0


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

* [PATCHv2 6/6] android/gatt: Check permissions before read execution
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
                   ` (3 preceding siblings ...)
  2014-05-26  9:10 ` [PATCHv2 5/6] android/gatt: Add proper permissions to built-in services Marcin Kraglak
@ 2014-05-26  9:10 ` Marcin Kraglak
  2014-05-26 12:19 ` [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Szymon Janc
  5 siblings, 0 replies; 7+ messages in thread
From: Marcin Kraglak @ 2014-05-26  9:10 UTC (permalink / raw)
  To: linux-bluetooth

Check device security level and attribute permissions before read
execution.
---
 android/gatt.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)

diff --git a/android/gatt.c b/android/gatt.c
index cde8816..2d0e06a 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -3817,13 +3817,101 @@ static bool match_dev_request_by_handle(const void *data, const void *user_data)
 	return handle_data->handle == handle;
 }
 
+static uint8_t check_device_permissions(struct gatt_device *device,
+					uint8_t opcode, uint32_t permissions)
+{
+	GIOChannel *io;
+	int sec_level;
+
+	io = g_attrib_get_channel(device->attrib);
+
+	if (!bt_io_get(io, NULL, BT_IO_OPT_SEC_LEVEL, &sec_level,
+							BT_IO_OPT_INVALID))
+		return ATT_ECODE_UNLIKELY;
+
+	switch (opcode) {
+	case ATT_OP_SIGNED_WRITE_CMD:
+		if (!(permissions & GATT_PERM_WRITE_SIGNED))
+				return ATT_ECODE_WRITE_NOT_PERM;
+
+		if ((permissions & GATT_PERM_WRITE_SIGNED_MITM) && sec_level <
+							BT_SECURITY_HIGH)
+			return ATT_ECODE_AUTHENTICATION;
+
+		break;
+	case ATT_OP_READ_BY_TYPE_REQ:
+	case ATT_OP_READ_REQ:
+	case ATT_OP_READ_BLOB_REQ:
+	case ATT_OP_READ_MULTI_REQ:
+	case ATT_OP_READ_BY_GROUP_REQ:
+		if (permissions && !(permissions & GATT_PERM_READ))
+			return ATT_ECODE_READ_NOT_PERM;
+
+		if ((permissions & GATT_PERM_READ_ENCRYPTED) && sec_level <
+							BT_SECURITY_MEDIUM)
+			return ATT_ECODE_INSUFF_ENC;
+
+		if ((permissions & GATT_PERM_READ_MITM) && sec_level <
+							BT_SECURITY_HIGH)
+			return ATT_ECODE_AUTHENTICATION;
+
+		if ((permissions & GATT_PERM_READ_AUTHORIZATION))
+			return ATT_ECODE_AUTHORIZATION;
+
+		break;
+	case ATT_OP_WRITE_REQ:
+	case ATT_OP_WRITE_CMD:
+	case ATT_OP_PREP_WRITE_REQ:
+	case ATT_OP_EXEC_WRITE_REQ:
+		if (!(permissions & GATT_PERM_WRITE))
+			return ATT_ECODE_WRITE_NOT_PERM;
+
+		if ((permissions & GATT_PERM_WRITE_ENCRYPTED) && sec_level <
+							BT_SECURITY_MEDIUM)
+			return ATT_ECODE_INSUFF_ENC;
+
+		if ((permissions & GATT_PERM_WRITE_MITM) &&
+						sec_level < BT_SECURITY_HIGH)
+			return ATT_ECODE_AUTHENTICATION;
+
+		if ((permissions & GATT_PERM_WRITE_AUTHORIZATION))
+			return ATT_ECODE_AUTHORIZATION;
+
+	break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 static void read_requested_attributes(void *data, void *user_data)
 {
 	struct pending_request *resp_data = data;
 	struct request_processing_data *process_data = user_data;
+	uint32_t permissions;
 	uint8_t *value;
 	int value_len;
 
+	permissions = gatt_db_get_attribute_permissions(gatt_db,
+			resp_data->handle);
+
+	/*
+	 * Check if it is attribute we didn't declare permissions, like service
+	 * declaration or included service. Set permissions to read only
+	 */
+	if (permissions == 0)
+		permissions = GATT_PERM_READ;
+
+	resp_data->error = check_device_permissions(process_data->device,
+							process_data->opcode,
+							permissions);
+
+	if (resp_data->error) {
+		resp_data->state = REQUEST_DONE;
+		return;
+	}
+
 	if (!gatt_db_read(gatt_db, resp_data->handle,
 						resp_data->offset,
 						process_data->opcode,
-- 
1.9.0


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

* Re: [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t
  2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
                   ` (4 preceding siblings ...)
  2014-05-26  9:10 ` [PATCHv2 6/6] android/gatt: Check permissions before read execution Marcin Kraglak
@ 2014-05-26 12:19 ` Szymon Janc
  5 siblings, 0 replies; 7+ messages in thread
From: Szymon Janc @ 2014-05-26 12:19 UTC (permalink / raw)
  To: Marcin Kraglak; +Cc: linux-bluetooth

Hi Marcin,

On Monday 26 of May 2014 11:10:24 Marcin Kraglak wrote:
> ---
>  src/shared/gatt-db.c | 6 +++---
>  src/shared/gatt-db.h | 4 ++--
>  2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/src/shared/gatt-db.c b/src/shared/gatt-db.c
> index 36316af..90c09bb 100644
> --- a/src/shared/gatt-db.c
> +++ b/src/shared/gatt-db.c
> @@ -48,7 +48,7 @@ struct gatt_db {
>  struct gatt_db_attribute {
>  	uint16_t handle;
>  	bt_uuid_t uuid;
> -	uint8_t permissions;
> +	uint32_t permissions;
>  	uint16_t value_len;
>  	uint8_t *value;
>  
> @@ -269,7 +269,7 @@ static void set_attribute_data(struct gatt_db_attribute *attribute,
>  
>  uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
>  						const bt_uuid_t *uuid,
> -						uint8_t permissions,
> +						uint32_t permissions,
>  						uint8_t properties,
>  						gatt_db_read_t read_func,
>  						gatt_db_write_t write_func,
> @@ -317,7 +317,7 @@ uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
>  
>  uint16_t gatt_db_add_char_descriptor(struct gatt_db *db, uint16_t handle,
>  						const bt_uuid_t *uuid,
> -						uint8_t permissions,
> +						uint32_t permissions,
>  						gatt_db_read_t read_func,
>  						gatt_db_write_t write_func,
>  						void *user_data)
> diff --git a/src/shared/gatt-db.h b/src/shared/gatt-db.h
> index 3d46730..350e34e 100644
> --- a/src/shared/gatt-db.h
> +++ b/src/shared/gatt-db.h
> @@ -41,7 +41,7 @@ typedef void (*gatt_db_write_t) (uint16_t handle, uint16_t offset,
>  
>  uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
>  						const bt_uuid_t *uuid,
> -						uint8_t permissions,
> +						uint32_t permissions,
>  						uint8_t properties,
>  						gatt_db_read_t read_func,
>  						gatt_db_write_t write_func,
> @@ -49,7 +49,7 @@ uint16_t gatt_db_add_characteristic(struct gatt_db *db, uint16_t handle,
>  
>  uint16_t gatt_db_add_char_descriptor(struct gatt_db *db, uint16_t handle,
>  						const bt_uuid_t *uuid,
> -						uint8_t permissions,
> +						uint32_t permissions,
>  						gatt_db_read_t read_func,
>  						gatt_db_write_t write_func,
>  						void *user_data);
> 

All patches applied (with some cleanups in the last one), thanks.

-- 
Best regards, 
Szymon Janc

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

end of thread, other threads:[~2014-05-26 12:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-26  9:10 [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Marcin Kraglak
2014-05-26  9:10 ` [PATCHv2 2/6] shared/gatt: Add helper for getting attribute's permissions Marcin Kraglak
2014-05-26  9:10 ` [PATCHv2 3/6] android/hal-gatt: Define attribute permissions values Marcin Kraglak
2014-05-26  9:10 ` [PATCHv2 4/6] android/gatt: Store proper attributes permissions in database Marcin Kraglak
2014-05-26  9:10 ` [PATCHv2 5/6] android/gatt: Add proper permissions to built-in services Marcin Kraglak
2014-05-26  9:10 ` [PATCHv2 6/6] android/gatt: Check permissions before read execution Marcin Kraglak
2014-05-26 12:19 ` [PATCHv2 1/6] shared/gatt: Define atribute permissions as uint32_t Szymon Janc

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).