broadband-modem: don't make fatal SIM swap check of IMSI or ICCID

If the SIM swap check using ICCID or IMSI fail, don't completely fail
the operation, as the other one may still succeed.

Fail the operation only if both checks failed.
This commit is contained in:
Aleksander Morgado
2022-07-16 22:24:33 +02:00
committed by Aleksander Morgado
parent 76f837697a
commit 1615c8627c
+37 -39
View File
@@ -4140,7 +4140,9 @@ typedef struct {
MMBaseSim *sim;
guint retries;
gchar *iccid;
gboolean iccid_check_done;
gchar *imsi;
gboolean imsi_check_done;
SimSwapCheckStep step;
} SimSwapContext;
@@ -4179,20 +4181,16 @@ complete_sim_swap_check (GTask *task,
self = MM_BROADBAND_MODEM (g_task_get_source_object (task));
ctx = g_task_get_task_data (task);
switch (ctx->step) {
case SIM_SWAP_CHECK_STEP_ICCID_CHANGED:
if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED) {
ctx->iccid_check_done = TRUE;
cached = mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (ctx->sim));
str = "identifier";
break;
case SIM_SWAP_CHECK_STEP_IMSI_CHANGED:
} else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED) {
ctx->imsi_check_done = TRUE;
cached = mm_gdbus_sim_get_imsi (MM_GDBUS_SIM (ctx->sim));
str = "imsi";
break;
case SIM_SWAP_CHECK_STEP_FIRST:
case SIM_SWAP_CHECK_STEP_LAST:
default:
} else
g_assert_not_reached();
}
if (g_strcmp0 (current, cached) != 0) {
mm_obj_info (self, "SIM %s has changed: %s -> %s",
@@ -4222,25 +4220,20 @@ load_sim_step_ready (MMBaseSim *sim,
self = MM_BROADBAND_MODEM (g_task_get_source_object (task));
ctx = g_task_get_task_data (task);
switch (ctx->step) {
case SIM_SWAP_CHECK_STEP_ICCID_CHANGED:
if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED) {
current = mm_base_sim_load_sim_identifier_finish (sim, res, &error);
str = "identifier";
break;
case SIM_SWAP_CHECK_STEP_IMSI_CHANGED:
} else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED) {
current = MM_BASE_SIM_GET_CLASS (sim)->load_imsi_finish (sim, res, &error);
str = "imsi";
break;
case SIM_SWAP_CHECK_STEP_FIRST:
case SIM_SWAP_CHECK_STEP_LAST:
default:
} else
g_assert_not_reached();
}
if (error) {
if (g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) {
g_task_return_error (task, error);
g_object_unref (task);
/* Skip checking this field right away */
ctx->step++;
sim_swap_check_step (task);
return;
}
@@ -4251,14 +4244,16 @@ load_sim_step_ready (MMBaseSim *sim,
g_clear_error (&error);
if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED)
g_timeout_add_seconds (1, (GSourceFunc) load_sim_identifier, task);
else
else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED)
g_timeout_add_seconds (1, (GSourceFunc) load_sim_imsi, task);
else
g_assert_not_reached();
return;
}
mm_obj_warn (self, "could not load SIM %s: %s", str, error->message);
g_task_return_error (task, error);
g_object_unref (task);
ctx->step++;
sim_swap_check_step (task);
return;
}
@@ -4268,7 +4263,9 @@ load_sim_step_ready (MMBaseSim *sim,
static gboolean
load_sim_identifier (GTask *task)
{
SimSwapContext *ctx = g_task_get_task_data (task);
SimSwapContext *ctx;
ctx = g_task_get_task_data (task);
mm_base_sim_load_sim_identifier (ctx->sim,
(GAsyncReadyCallback)load_sim_step_ready,
@@ -4280,22 +4277,20 @@ load_sim_identifier (GTask *task)
static gboolean
load_sim_imsi (GTask *task)
{
SimSwapContext *ctx = g_task_get_task_data (task);
SimSwapContext *ctx;
if (!MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi ||
!MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi_finish) {
g_task_return_new_error (task,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"sim imsi could not be loaded");
g_object_unref (task);
return G_SOURCE_REMOVE;
ctx = g_task_get_task_data (task);
if (MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi &&
MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi_finish) {
MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi (ctx->sim,
(GAsyncReadyCallback)load_sim_step_ready,
task);
} else {
ctx->step++;
sim_swap_check_step (task);
}
MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi (
ctx->sim,
(GAsyncReadyCallback)load_sim_step_ready,
task);
return G_SOURCE_REMOVE;
}
@@ -4323,7 +4318,6 @@ sim_swap_check_step (GTask *task)
case SIM_SWAP_CHECK_STEP_IMSI_CHANGED:
ctx->retries = SIM_SWAP_CHECK_LOAD_RETRIES_MAX;
if (ctx->imsi)
complete_sim_swap_check (task, ctx->imsi);
else
@@ -4331,7 +4325,11 @@ sim_swap_check_step (GTask *task)
return;
case SIM_SWAP_CHECK_STEP_LAST:
g_task_return_boolean (task, TRUE);
if (!ctx->iccid_check_done && !ctx->imsi_check_done)
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Couldn't do either ICCID or IMSI check");
else
g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;