diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-01-09 12:46:11 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-02-12 11:00:47 +0100 |
commit | fc47fa7fa3f3529744e681953300f4b4bd10e5d1 (patch) | |
tree | d84ef63cb83ad217820e3d2da80c8ec42b376720 | |
parent | e8d81836cb346af259ef26790595e77588c6cf6b (diff) |
base-sim: don't allow sending PIN/PUK if not required
This avoids issues when e.g. sending SIM-PIN while the modem is
already unlocked or when SIM-PIN is not enabled.
Under those conditions, the needlessly sent SIM-PIN unlock attempt may
fail while libmm-glib/mmcli reports a successful operation. E.g.:
# mmcli --sim=/org/freedesktop/ModemManager1/SIM/0 --pin=3497
successfully sent PIN code to the SIM
But in reality...
Wed Nov 20 14:38:52 2019 daemon.debug [4254]: <debug> [1574260732.489513] Verifying PIN...
Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] sent message...
<<<<<< RAW:
<<<<<< length = 27
<<<<<< data = 01:1A:00:00:0B:02:00:09:00:26:00:0E:00:02:06:00:01:04:33:34:39:37:01:02:00:06:00
Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] sent generic request (translated)...
<<<<<< QMUX:
<<<<<< length = 26
<<<<<< flags = 0x00
<<<<<< service = "uim"
<<<<<< client = 2
<<<<<< QMI:
<<<<<< flags = "none"
<<<<<< transaction = 9
<<<<<< tlv_length = 14
<<<<<< message = "Verify PIN" (0x0026)
<<<<<< TLV:
<<<<<< type = "Info" (0x02)
<<<<<< length = 6
<<<<<< value = 01:04:33:34:39:37
<<<<<< translated = [ pin_id = 'pin1' pin_value = '3497' ]
Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] received message...
<<<<<< RAW:
<<<<<< length = 30
<<<<<< data = 01:1D:00:80:0B:02:02:09:00:26:00:11:00:02:04:00:01:00:52:00:13:02:00:69:84:10:02:00:03:0A
Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] received generic response (translated)...
<<<<<< QMUX:
<<<<<< length = 29
<<<<<< flags = 0x80
<<<<<< service = "uim"
<<<<<< client = 2
<<<<<< QMI:
<<<<<< flags = "response"
<<<<<< transaction = 9
<<<<<< tlv_length = 17
<<<<<< message = "Verify PIN" (0x0026)
<<<<<< TLV:
<<<<<< type = "Result" (0x02)
<<<<<< length = 4
<<<<<< value = 01:00:52:00
<<<<<< translated = FAILURE: AccessDenied
As we already know what the current lock status is, just abort the
user operation if the unlock operation isn't required.
(cherry picked from commit fd052c8e584a41efc211690e993f6ef0ee3092ac)
-rw-r--r-- | src/mm-base-sim.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 3a5b1f75..2850cb19 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -635,6 +635,14 @@ mm_base_sim_send_pin (MMBaseSim *self, return; } + /* Only allow sending SIM-PIN if really SIM-PIN locked */ + if (mm_iface_modem_get_unlock_required (MM_IFACE_MODEM (self->priv->modem)) != MM_MODEM_LOCK_SIM_PIN) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Cannot send PIN: device is not SIM-PIN locked"); + g_object_unref (task); + return; + } + MM_BASE_SIM_GET_CLASS (self)->send_pin (self, pin, (GAsyncReadyCallback)send_pin_ready, @@ -661,6 +669,14 @@ mm_base_sim_send_puk (MMBaseSim *self, return; } + /* Only allow sending SIM-PUK if really SIM-PUK locked */ + if (mm_iface_modem_get_unlock_required (MM_IFACE_MODEM (self->priv->modem)) != MM_MODEM_LOCK_SIM_PUK) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Cannot send PUK: device is not SIM-PUK locked"); + g_object_unref (task); + return; + } + MM_BASE_SIM_GET_CLASS (self)->send_puk (self, puk, new_pin, |