diff options
author | Teemu Ikonen <tpikonen@mailbox.org> | 2022-10-23 18:01:04 +0300 |
---|---|---|
committer | Teemu Ikonen <tpikonen@mailbox.org> | 2022-10-30 13:48:29 +0200 |
commit | ef606c0cfcc6348a3cf074332a9f167661718bf6 (patch) | |
tree | 76bdee9dbf2f678cca5f267cef6a181e0fbcf78f | |
parent | b70965dd73f910d67c1a19b4c2d43f0a233883a5 (diff) | |
download | geoclue-ef606c0cfcc6348a3cf074332a9f167661718bf6.tar.gz |
mozilla: Validate TowerTec in the setter func and on query creation
Set tower_valid to true only on valid TowerTec values in
gclue_mozilla_set_tower().
Add towertec_to_radiotype() function which converts a TowerTec value to
an MLS API 'radioType' string. If TowerTec does not correspond to values
known to MLS, skip the creation of 'radioType' and 'cellTowers' members
in the MLS locate query.
-rw-r--r-- | src/gclue-3g-tower.h | 1 | ||||
-rw-r--r-- | src/gclue-mozilla.c | 54 |
2 files changed, 32 insertions, 23 deletions
diff --git a/src/gclue-3g-tower.h b/src/gclue-3g-tower.h index a40e1fe..f6b69ff 100644 --- a/src/gclue-3g-tower.h +++ b/src/gclue-3g-tower.h @@ -31,6 +31,7 @@ typedef enum { GCLUE_TOWER_TEC_4G = 3, GCLUE_TOWER_TEC_NO_FIX = 99, } GClueTowerTec; +# define GCLUE_TOWER_TEC_MAX_VALID GCLUE_TOWER_TEC_4G typedef struct _GClue3GTower GClue3GTower; diff --git a/src/gclue-mozilla.c b/src/gclue-mozilla.c index 08f7e71..0472cb7 100644 --- a/src/gclue-mozilla.c +++ b/src/gclue-mozilla.c @@ -154,6 +154,28 @@ error: return FALSE; } +static gboolean +towertec_to_radiotype (GClueTowerTec tec, + const char **radiotype_p) +{ + switch (tec) { + case GCLUE_TOWER_TEC_2G: + *radiotype_p = "gsm"; + break; + case GCLUE_TOWER_TEC_3G: + *radiotype_p = "wcdma"; + break; + case GCLUE_TOWER_TEC_4G: + *radiotype_p = "lte"; + break; + default: + *radiotype_p = NULL; + return FALSE; + } + + return TRUE; +} + SoupMessage * gclue_mozilla_create_query (GClueMozilla *mozilla, gboolean skip_tower, @@ -169,7 +191,7 @@ gclue_mozilla_create_query (GClueMozilla *mozilla, JsonNode *root_node; char *data; gsize data_len; - const char *uri; + const char *uri, *radiotype; guint n_non_ignored_bsss; GList *iter; gint64 mcc, mnc; @@ -198,17 +220,10 @@ gclue_mozilla_create_query (GClueMozilla *mozilla, } if (mozilla->priv->tower_valid && !skip_tower && + towertec_to_radiotype (mozilla->priv->tower.tec, &radiotype) && operator_code_to_mcc_mnc (mozilla->priv->tower.opc, &mcc, &mnc)) { - if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_4G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "lte"); - } else if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_3G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "wcdma"); - } else if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_2G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "gsm"); - } + json_builder_set_member_name (builder, "radioType"); + json_builder_add_string_value (builder, radiotype); json_builder_set_member_name (builder, "cellTowers"); json_builder_begin_array (builder); @@ -223,17 +238,8 @@ gclue_mozilla_create_query (GClueMozilla *mozilla, json_builder_add_int_value (builder, mnc); json_builder_set_member_name (builder, "locationAreaCode"); json_builder_add_int_value (builder, mozilla->priv->tower.lac); - if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_4G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "lte"); - } else if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_3G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "wcdma"); - } else if (mozilla->priv->tower.tec == GCLUE_TOWER_TEC_2G) { - json_builder_set_member_name (builder, "radioType"); - json_builder_add_string_value (builder, "gsm"); - } - + json_builder_set_member_name (builder, "radioType"); + json_builder_add_string_value (builder, radiotype); json_builder_end_object (builder); @@ -673,7 +679,9 @@ gclue_mozilla_set_tower (GClueMozilla *mozilla, { g_return_if_fail (GCLUE_IS_MOZILLA (mozilla)); - if (!tower) { + if (!tower || + !(tower->tec > GCLUE_TOWER_TEC_UNKNOWN + && tower->tec <= GCLUE_TOWER_TEC_MAX_VALID)) { mozilla->priv->tower_valid = FALSE; return; } |