mirror of git://git.sysmocom.de/ofono
sim: Allow usage of SIM codes longer than 8 digits
Some PIN codes (e.g. subsidy locks, etc) can have PIN codes much longer than the default 8 digits.
This commit is contained in:
parent
d8eacb6636
commit
a8671fe1f7
|
@ -402,7 +402,7 @@ static gboolean cb_ss_control(int type, const char *sc,
|
|||
if (strlen(dn) > 0)
|
||||
goto bad_format;
|
||||
|
||||
if (type != SS_CONTROL_TYPE_QUERY && !is_valid_pin(sia, PIN_TYPE_NET))
|
||||
if (type != SS_CONTROL_TYPE_QUERY && !__ofono_is_valid_net_pin(sia))
|
||||
goto bad_format;
|
||||
|
||||
switch (type) {
|
||||
|
@ -524,7 +524,7 @@ static gboolean cb_ss_passwd(const char *sc,
|
|||
if (fac == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!is_valid_pin(old, PIN_TYPE_NET) || !is_valid_pin(new, PIN_TYPE_NET))
|
||||
if (!__ofono_is_valid_net_pin(old) || !__ofono_is_valid_net_pin(new))
|
||||
goto bad_format;
|
||||
|
||||
cb->pending = dbus_message_ref(msg);
|
||||
|
@ -862,7 +862,7 @@ static DBusMessage *cb_set_property(DBusConnection *conn, DBusMessage *msg,
|
|||
return __ofono_error_invalid_args(msg);
|
||||
|
||||
dbus_message_iter_get_basic(&iter, &passwd);
|
||||
if (!is_valid_pin(passwd, PIN_TYPE_NET))
|
||||
if (!__ofono_is_valid_net_pin(passwd))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
}
|
||||
|
||||
|
@ -909,7 +909,7 @@ static DBusMessage *cb_disable_all(DBusConnection *conn, DBusMessage *msg,
|
|||
DBUS_TYPE_INVALID) == FALSE)
|
||||
return __ofono_error_invalid_args(msg);
|
||||
|
||||
if (!is_valid_pin(passwd, PIN_TYPE_NET))
|
||||
if (!__ofono_is_valid_net_pin(passwd))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
cb_set_query_bounds(cb, fac, FALSE);
|
||||
|
@ -957,10 +957,10 @@ static DBusMessage *cb_set_passwd(DBusConnection *conn, DBusMessage *msg,
|
|||
DBUS_TYPE_INVALID) == FALSE)
|
||||
return __ofono_error_invalid_args(msg);
|
||||
|
||||
if (!is_valid_pin(old_passwd, PIN_TYPE_NET))
|
||||
if (!__ofono_is_valid_net_pin(old_passwd))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(new_passwd, PIN_TYPE_NET))
|
||||
if (!__ofono_is_valid_net_pin(new_passwd))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
cb->pending = dbus_message_ref(msg);
|
||||
|
|
|
@ -549,7 +549,7 @@ static DBusMessage *cm_set_property(DBusConnection *conn, DBusMessage *msg,
|
|||
|
||||
dbus_message_iter_get_basic(&iter, &passwd);
|
||||
|
||||
if (!is_valid_pin(passwd, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(passwd, OFONO_SIM_PASSWORD_SIM_PIN2))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
for (property = cm_properties; property->name; property++) {
|
||||
|
@ -621,7 +621,7 @@ static DBusMessage *cm_acm_reset(DBusConnection *conn, DBusMessage *msg,
|
|||
DBUS_TYPE_INVALID) == FALSE)
|
||||
return __ofono_error_invalid_args(msg);
|
||||
|
||||
if (!is_valid_pin(pin2, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(pin2, OFONO_SIM_PASSWORD_SIM_PIN2))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
cm->pending = dbus_message_ref(msg);
|
||||
|
|
37
src/common.c
37
src/common.c
|
@ -649,43 +649,6 @@ const char *bearer_class_to_string(enum bearer_class cls)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
gboolean is_valid_pin(const char *pin, enum pin_type type)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Pin must not be empty */
|
||||
if (pin == NULL || pin[0] == '\0')
|
||||
return FALSE;
|
||||
|
||||
i = strlen(pin);
|
||||
if (i != strspn(pin, "0123456789"))
|
||||
return FALSE;
|
||||
|
||||
switch (type) {
|
||||
case PIN_TYPE_PIN:
|
||||
/* 11.11 Section 9.3 ("CHV"): 4..8 IA-5 digits */
|
||||
if (4 <= i && i <= 8)
|
||||
return TRUE;
|
||||
break;
|
||||
case PIN_TYPE_PUK:
|
||||
/* 11.11 Section 9.3 ("UNBLOCK CHV"), 8 IA-5 digits */
|
||||
if (i == 8)
|
||||
return TRUE;
|
||||
break;
|
||||
case PIN_TYPE_NET:
|
||||
/* 22.004 Section 5.2, 4 IA-5 digits */
|
||||
if (i == 4)
|
||||
return TRUE;
|
||||
break;
|
||||
case PIN_TYPE_NONE:
|
||||
if (i < 8)
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
const char *registration_status_to_string(int status)
|
||||
{
|
||||
switch (status) {
|
||||
|
|
|
@ -122,13 +122,6 @@ enum ss_cssu {
|
|||
SS_MT_CALL_DEFLECTED = 9,
|
||||
};
|
||||
|
||||
enum pin_type {
|
||||
PIN_TYPE_NONE,
|
||||
PIN_TYPE_PIN,
|
||||
PIN_TYPE_PUK,
|
||||
PIN_TYPE_NET,
|
||||
};
|
||||
|
||||
/* 27.007 Section 10.1.10 */
|
||||
enum context_status {
|
||||
CONTEXT_STATUS_DEACTIVATED = 0,
|
||||
|
@ -162,8 +155,6 @@ const char *ss_control_type_to_string(enum ss_control_type type);
|
|||
|
||||
const char *bearer_class_to_string(enum bearer_class cls);
|
||||
|
||||
gboolean is_valid_pin(const char *pin, enum pin_type type);
|
||||
|
||||
const char *registration_status_to_string(int status);
|
||||
const char *registration_tech_to_string(int tech);
|
||||
const char *packet_bearer_to_string(int bearer);
|
||||
|
|
|
@ -299,6 +299,11 @@ ofono_bool_t __ofono_sim_service_available(struct ofono_sim *sim,
|
|||
int ust_service,
|
||||
int sst_service);
|
||||
|
||||
ofono_bool_t __ofono_is_valid_sim_pin(const char *pin,
|
||||
enum ofono_sim_password_type type);
|
||||
|
||||
ofono_bool_t __ofono_is_valid_net_pin(const char *pin);
|
||||
|
||||
#include <ofono/stk.h>
|
||||
|
||||
typedef void (*__ofono_sms_sim_download_cb_t)(ofono_bool_t ok,
|
||||
|
|
75
src/sim.c
75
src/sim.c
|
@ -676,7 +676,7 @@ static DBusMessage *sim_lock_or_unlock(struct ofono_sim *sim, int lock,
|
|||
type == OFONO_SIM_PASSWORD_SIM_PIN2)
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(pin, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(pin, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
sim->pending = dbus_message_ref(msg);
|
||||
|
@ -748,10 +748,10 @@ static DBusMessage *sim_change_pin(DBusConnection *conn, DBusMessage *msg,
|
|||
if (password_is_pin(type) == FALSE)
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(old, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(old, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(new, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(new, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!strcmp(new, old))
|
||||
|
@ -803,7 +803,7 @@ static DBusMessage *sim_enter_pin(DBusConnection *conn, DBusMessage *msg,
|
|||
if (type == OFONO_SIM_PASSWORD_NONE || type != sim->pin_type)
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(pin, PIN_TYPE_PIN))
|
||||
if (!__ofono_is_valid_sim_pin(pin, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
sim->pending = dbus_message_ref(msg);
|
||||
|
@ -1013,10 +1013,12 @@ static DBusMessage *sim_reset_pin(DBusConnection *conn, DBusMessage *msg,
|
|||
if (type == OFONO_SIM_PASSWORD_NONE || type != sim->pin_type)
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(puk, PIN_TYPE_PUK))
|
||||
if (!__ofono_is_valid_sim_pin(puk, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
if (!is_valid_pin(pin, PIN_TYPE_PIN))
|
||||
type = puk2pin(type);
|
||||
|
||||
if (!__ofono_is_valid_sim_pin(pin, type))
|
||||
return __ofono_error_invalid_format(msg);
|
||||
|
||||
sim->pending = dbus_message_ref(msg);
|
||||
|
@ -2378,3 +2380,64 @@ void *ofono_sim_get_data(struct ofono_sim *sim)
|
|||
{
|
||||
return sim->driver_data;
|
||||
}
|
||||
|
||||
ofono_bool_t is_valid_pin(const char *pin, int min, int max)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Pin must not be empty */
|
||||
if (pin == NULL || pin[0] == '\0')
|
||||
return FALSE;
|
||||
|
||||
i = strlen(pin);
|
||||
if (i != strspn(pin, "0123456789"))
|
||||
return FALSE;
|
||||
|
||||
if (min <= i && i <= max)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ofono_bool_t __ofono_is_valid_sim_pin(const char *pin,
|
||||
enum ofono_sim_password_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case OFONO_SIM_PASSWORD_SIM_PIN:
|
||||
case OFONO_SIM_PASSWORD_SIM_PIN2:
|
||||
/* 11.11 Section 9.3 ("CHV"): 4..8 IA-5 digits */
|
||||
return is_valid_pin(pin, 4, 8);
|
||||
break;
|
||||
case OFONO_SIM_PASSWORD_PHSIM_PIN:
|
||||
case OFONO_SIM_PASSWORD_PHFSIM_PIN:
|
||||
case OFONO_SIM_PASSWORD_PHNET_PIN:
|
||||
case OFONO_SIM_PASSWORD_PHNETSUB_PIN:
|
||||
case OFONO_SIM_PASSWORD_PHSP_PIN:
|
||||
case OFONO_SIM_PASSWORD_PHCORP_PIN:
|
||||
/* 22.022 Section 14 4..16 IA-5 digits */
|
||||
return is_valid_pin(pin, 4, 16);
|
||||
break;
|
||||
case OFONO_SIM_PASSWORD_SIM_PUK:
|
||||
case OFONO_SIM_PASSWORD_SIM_PUK2:
|
||||
case OFONO_SIM_PASSWORD_PHFSIM_PUK:
|
||||
case OFONO_SIM_PASSWORD_PHNET_PUK:
|
||||
case OFONO_SIM_PASSWORD_PHNETSUB_PUK:
|
||||
case OFONO_SIM_PASSWORD_PHSP_PUK:
|
||||
case OFONO_SIM_PASSWORD_PHCORP_PUK:
|
||||
/* 11.11 Section 9.3 ("UNBLOCK CHV"), 8 IA-5 digits */
|
||||
return is_valid_pin(pin, 8, 8);
|
||||
break;
|
||||
case OFONO_SIM_PASSWORD_NONE:
|
||||
return is_valid_pin(pin, 0, 8);
|
||||
break;
|
||||
case OFONO_SIM_PASSWORD_INVALID:
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ofono_bool_t __ofono_is_valid_net_pin(const char *pin)
|
||||
{
|
||||
return is_valid_pin(pin, 4, 4);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue