if (strlen(dn) > 0)
goto bad_format;
- if (type != SS_CONTROL_TYPE_QUERY && !is_valid_pin(sia))
+ if (type != SS_CONTROL_TYPE_QUERY && !is_valid_pin(sia, PIN_TYPE_NET))
goto bad_format;
switch (type) {
if (!fac)
return FALSE;
- if (!is_valid_pin(old) || !is_valid_pin(new))
+ if (!is_valid_pin(old, PIN_TYPE_NET) || !is_valid_pin(new, PIN_TYPE_NET))
goto bad_format;
cb->pending = dbus_message_ref(msg);
return __ofono_error_invalid_args(msg);
dbus_message_iter_get_basic(&iter, &passwd);
- if (!is_valid_pin(passwd))
+ if (!is_valid_pin(passwd, PIN_TYPE_NET))
return __ofono_error_invalid_format(msg);
}
DBUS_TYPE_INVALID) == FALSE)
return __ofono_error_invalid_args(msg);
- if (!is_valid_pin(passwd))
+ if (!is_valid_pin(passwd, PIN_TYPE_NET))
return __ofono_error_invalid_format(msg);
cb_set_query_bounds(cb, fac, FALSE);
DBUS_TYPE_INVALID) == FALSE)
return __ofono_error_invalid_args(msg);
- if (!is_valid_pin(old_passwd))
+ if (!is_valid_pin(old_passwd, PIN_TYPE_NET))
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(new_passwd))
+ if (!is_valid_pin(new_passwd, PIN_TYPE_NET))
return __ofono_error_invalid_format(msg);
cb->pending = dbus_message_ref(msg);
dbus_message_iter_get_basic(&iter, &passwd);
- if (!is_valid_pin(passwd))
+ if (!is_valid_pin(passwd, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
for (property = cm_properties; property->name; property++) {
DBUS_TYPE_INVALID) == FALSE)
return __ofono_error_invalid_args(msg);
- if (!is_valid_pin(pin2))
+ if (!is_valid_pin(pin2, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
cm->pending = dbus_message_ref(msg);
return NULL;
}
-gboolean is_valid_pin(const char *pin)
+gboolean is_valid_pin(const char *pin, enum pin_type type)
{
unsigned int i;
if (pin == NULL || pin[0] == '\0')
return FALSE;
- for (i = 0; i < strlen(pin); i++)
- if (pin[i] < '0' || pin[i] > '9')
- return FALSE;
-
- if (i > 8)
+ i = strlen(pin);
+ if (i != strspn(pin, "012345679"))
return FALSE;
- return TRUE;
+ 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;
+ }
+
+ return FALSE;
}
const char *registration_status_to_string(int status)
SS_MT_CALL_DEFLECTED = 9,
};
+enum pin_type {
+ PIN_TYPE_NONE = 0,
+ PIN_TYPE_PIN = 1,
+ PIN_TYPE_PUK = 2,
+ PIN_TYPE_NET = 3,
+};
+
const char *telephony_error_to_str(const struct ofono_error *error);
gboolean valid_phone_number_format(const char *number);
const char *bearer_class_to_string(enum bearer_class cls);
-gboolean is_valid_pin(const char *pin);
+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);
type == OFONO_SIM_PASSWORD_SIM_PIN2)
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(pin))
+ if (!is_valid_pin(pin, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
sim->pending = dbus_message_ref(msg);
if (password_is_pin(type) == FALSE)
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(old))
+ if (!is_valid_pin(old, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(new))
+ if (!is_valid_pin(new, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
if (!strcmp(new, old))
if (type == OFONO_SIM_PASSWORD_NONE || type != sim->pin_type)
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(pin))
+ if (!is_valid_pin(pin, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
sim->pending = dbus_message_ref(msg);
if (type == OFONO_SIM_PASSWORD_NONE || type != sim->pin_type)
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(puk))
+ if (!is_valid_pin(puk, PIN_TYPE_PUK))
return __ofono_error_invalid_format(msg);
- if (!is_valid_pin(pin))
+ if (!is_valid_pin(pin, PIN_TYPE_PIN))
return __ofono_error_invalid_format(msg);
sim->pending = dbus_message_ref(msg);