All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sim: enable usage of SIM pass codes longer than 8 digits
@ 2011-02-07 14:49 Jussi Kangas
  2011-02-08  4:17 ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Jussi Kangas @ 2011-02-07 14:49 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 9119 bytes --]

---

Hi,

Here is my second proposal for how to enable usage of SIM lock codes longer than eight digits. I removed the namespace problem and fixed a problem with puk reset. 

Br,
Jussi

 include/sim.h      |    1 +
 src/call-barring.c |   14 ++++++++------
 src/call-meter.c   |    4 ++--
 src/common.c       |   29 ++++++++++++++++++++++++-----
 src/common.h       |   11 +++--------
 src/ofono.h        |    3 +++
 src/sim.c          |   15 +++++++++------
 7 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/include/sim.h b/include/sim.h
index 5e3ba5b..7f0313e 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -54,6 +54,7 @@ enum ofono_sim_password_type {
 	OFONO_SIM_PASSWORD_PHNETSUB_PUK,
 	OFONO_SIM_PASSWORD_PHSP_PUK,
 	OFONO_SIM_PASSWORD_PHCORP_PUK,
+	OFONO_SIM_PASSWORD_PIN_TYPE_NET,
 	OFONO_SIM_PASSWORD_INVALID,
 };
 
diff --git a/src/call-barring.c b/src/call-barring.c
index 649826e..fdcecbf 100644
--- a/src/call-barring.c
+++ b/src/call-barring.c
@@ -402,7 +402,8 @@ 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 &&
+		!is_valid_pin(sia, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 		goto bad_format;
 
 	switch (type) {
@@ -524,7 +525,8 @@ 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 (!is_valid_pin(old, OFONO_SIM_PASSWORD_PIN_TYPE_NET) ||
+		!is_valid_pin(new, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 		goto bad_format;
 
 	cb->pending = dbus_message_ref(msg);
@@ -862,7 +864,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 (!is_valid_pin(passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 			return __ofono_error_invalid_format(msg);
 	}
 
@@ -909,7 +911,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 (!is_valid_pin(passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 		return __ofono_error_invalid_format(msg);
 
 	cb_set_query_bounds(cb, fac, FALSE);
@@ -957,10 +959,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 (!is_valid_pin(old_passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 		return __ofono_error_invalid_format(msg);
 
-	if (!is_valid_pin(new_passwd, PIN_TYPE_NET))
+	if (!is_valid_pin(new_passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
 		return __ofono_error_invalid_format(msg);
 
 	cb->pending = dbus_message_ref(msg);
diff --git a/src/call-meter.c b/src/call-meter.c
index d483e2e..a7f8ebb 100644
--- a/src/call-meter.c
+++ b/src/call-meter.c
@@ -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 (!is_valid_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 (!is_valid_pin(pin2, OFONO_SIM_PASSWORD_SIM_PIN2))
 		return __ofono_error_invalid_format(msg);
 
 	cm->pending = dbus_message_ref(msg);
diff --git a/src/common.c b/src/common.c
index f25f105..60bf20c 100644
--- a/src/common.c
+++ b/src/common.c
@@ -649,7 +649,7 @@ const char *bearer_class_to_string(enum bearer_class cls)
 	return NULL;
 }
 
-gboolean is_valid_pin(const char *pin, enum pin_type type)
+gboolean is_valid_pin(const char *pin, enum ofono_sim_password_type type)
 {
 	unsigned int i;
 
@@ -662,25 +662,44 @@ gboolean is_valid_pin(const char *pin, enum pin_type type)
 		return FALSE;
 
 	switch (type) {
-	case PIN_TYPE_PIN:
+	case OFONO_SIM_PASSWORD_SIM_PIN:
+	case OFONO_SIM_PASSWORD_SIM_PIN2:
 		/* 11.11 Section 9.3 ("CHV"): 4..8 IA-5 digits */
 		if (4 <= i && i <= 8)
 			return TRUE;
 		break;
-	case PIN_TYPE_PUK:
+	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 */
+		if (4 <= i && i <= 16)
+			return TRUE;
+		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 */
 		if (i == 8)
 			return TRUE;
 		break;
-	case PIN_TYPE_NET:
+	case OFONO_SIM_PASSWORD_PIN_TYPE_NET:
 		/* 22.004 Section 5.2, 4 IA-5 digits */
 		if (i == 4)
 			return TRUE;
 		break;
-	case PIN_TYPE_NONE:
+	case OFONO_SIM_PASSWORD_NONE:
 		if (i < 8)
 			return TRUE;
 		break;
+	case OFONO_SIM_PASSWORD_INVALID:
+		break;
 	}
 
 	return FALSE;
diff --git a/src/common.h b/src/common.h
index 09f2deb..acdbce5 100644
--- a/src/common.h
+++ b/src/common.h
@@ -19,6 +19,8 @@
  *
  */
 
+#include "ofono.h"
+
 /* 27.007 Section 7.3 <AcT> */
 enum access_technology {
 	ACCESS_TECHNOLOGY_GSM =			0,
@@ -122,13 +124,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,7 +157,7 @@ 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);
+gboolean is_valid_pin(const char *pin, enum ofono_sim_password_type type);
 
 const char *registration_status_to_string(int status);
 const char *registration_tech_to_string(int tech);
diff --git a/src/ofono.h b/src/ofono.h
index 6ba0187..ddd1bb9 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -18,6 +18,8 @@
  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  *
  */
+#ifndef OFONO_H
+#define OFONO_H
 
 #include <glib.h>
 
@@ -430,3 +432,4 @@ ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
 void __ofono_gprs_provision_free_settings(
 				struct ofono_gprs_provision_data *settings,
 				int count);
+#endif
diff --git a/src/sim.c b/src/sim.c
index 41d7e1d..42d0f39 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -174,6 +174,7 @@ static gboolean password_is_pin(enum ofono_sim_password_type type)
 	case OFONO_SIM_PASSWORD_PHCORP_PUK:
 	case OFONO_SIM_PASSWORD_INVALID:
 	case OFONO_SIM_PASSWORD_NONE:
+	case OFONO_SIM_PASSWORD_PIN_TYPE_NET:
 		return FALSE;
 	}
 
@@ -675,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 (!is_valid_pin(pin, type))
 		return __ofono_error_invalid_format(msg);
 
 	sim->pending = dbus_message_ref(msg);
@@ -747,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 (!is_valid_pin(old, type))
 		return __ofono_error_invalid_format(msg);
 
-	if (!is_valid_pin(new, PIN_TYPE_PIN))
+	if (!is_valid_pin(new, type))
 		return __ofono_error_invalid_format(msg);
 
 	if (!strcmp(new, old))
@@ -802,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 (!is_valid_pin(pin, type))
 		return __ofono_error_invalid_format(msg);
 
 	sim->pending = dbus_message_ref(msg);
@@ -1012,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 (!is_valid_pin(puk, type))
 		return __ofono_error_invalid_format(msg);
 
-	if (!is_valid_pin(pin, PIN_TYPE_PIN))
+	type = puk2pin(type);
+
+	if (!is_valid_pin(pin, type))
 		return __ofono_error_invalid_format(msg);
 
 	sim->pending = dbus_message_ref(msg);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] sim: enable usage of SIM pass codes longer than 8 digits
  2011-02-07 14:49 Jussi Kangas
@ 2011-02-08  4:17 ` Denis Kenzior
  0 siblings, 0 replies; 4+ messages in thread
From: Denis Kenzior @ 2011-02-08  4:17 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 10774 bytes --]

Hi Jussi,

On 02/07/2011 08:49 AM, Jussi Kangas wrote:
> ---
> 
> Hi,
> 
> Here is my second proposal for how to enable usage of SIM lock codes longer than eight digits. I removed the namespace problem and fixed a problem with puk reset. 
> 
> Br,
> Jussi
> 
>  include/sim.h      |    1 +
>  src/call-barring.c |   14 ++++++++------
>  src/call-meter.c   |    4 ++--
>  src/common.c       |   29 ++++++++++++++++++++++++-----
>  src/common.h       |   11 +++--------
>  src/ofono.h        |    3 +++
>  src/sim.c          |   15 +++++++++------
>  7 files changed, 50 insertions(+), 27 deletions(-)
> 
> diff --git a/include/sim.h b/include/sim.h
> index 5e3ba5b..7f0313e 100644
> --- a/include/sim.h
> +++ b/include/sim.h
> @@ -54,6 +54,7 @@ enum ofono_sim_password_type {
>  	OFONO_SIM_PASSWORD_PHNETSUB_PUK,
>  	OFONO_SIM_PASSWORD_PHSP_PUK,
>  	OFONO_SIM_PASSWORD_PHCORP_PUK,
> +	OFONO_SIM_PASSWORD_PIN_TYPE_NET,

So just adding an enum here is a little dangerous since we use the array
size for things like look up tables and iterators inside src/sim.c

>  	OFONO_SIM_PASSWORD_INVALID,
>  };
>  
> diff --git a/src/call-barring.c b/src/call-barring.c
> index 649826e..fdcecbf 100644
> --- a/src/call-barring.c
> +++ b/src/call-barring.c
> @@ -402,7 +402,8 @@ 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 &&
> +		!is_valid_pin(sia, OFONO_SIM_PASSWORD_PIN_TYPE_NET))

Watch out for coding style, see item M4.

>  		goto bad_format;
>  
>  	switch (type) {
> @@ -524,7 +525,8 @@ 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 (!is_valid_pin(old, OFONO_SIM_PASSWORD_PIN_TYPE_NET) ||
> +		!is_valid_pin(new, OFONO_SIM_PASSWORD_PIN_TYPE_NET))

As above

>  		goto bad_format;
>  
>  	cb->pending = dbus_message_ref(msg);
> @@ -862,7 +864,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 (!is_valid_pin(passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
>  			return __ofono_error_invalid_format(msg);
>  	}
>  
> @@ -909,7 +911,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 (!is_valid_pin(passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
>  		return __ofono_error_invalid_format(msg);
>  
>  	cb_set_query_bounds(cb, fac, FALSE);
> @@ -957,10 +959,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 (!is_valid_pin(old_passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
>  		return __ofono_error_invalid_format(msg);
>  
> -	if (!is_valid_pin(new_passwd, PIN_TYPE_NET))
> +	if (!is_valid_pin(new_passwd, OFONO_SIM_PASSWORD_PIN_TYPE_NET))
>  		return __ofono_error_invalid_format(msg);
>  
>  	cb->pending = dbus_message_ref(msg);
> diff --git a/src/call-meter.c b/src/call-meter.c
> index d483e2e..a7f8ebb 100644
> --- a/src/call-meter.c
> +++ b/src/call-meter.c
> @@ -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 (!is_valid_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 (!is_valid_pin(pin2, OFONO_SIM_PASSWORD_SIM_PIN2))
>  		return __ofono_error_invalid_format(msg);
>  
>  	cm->pending = dbus_message_ref(msg);
> diff --git a/src/common.c b/src/common.c
> index f25f105..60bf20c 100644
> --- a/src/common.c
> +++ b/src/common.c
> @@ -649,7 +649,7 @@ const char *bearer_class_to_string(enum bearer_class cls)
>  	return NULL;
>  }
>  
> -gboolean is_valid_pin(const char *pin, enum pin_type type)
> +gboolean is_valid_pin(const char *pin, enum ofono_sim_password_type type)

Why don't we keep things simple.  Modify is_valid_pin to take a pin and
a min and max number of digits.

gboolean is_valid_pin_with_limits(const char *pin, int min, int max)
(feel free to pick some better name)

Then just add two functions:

__ofono_valid_net_pin(const char *pin)
__ofono_valid_sim_pin(const char *pin, enum ofono_sim_password_type type)

Stick both in ofono.h / sim.c somewhere

>  {
>  	unsigned int i;
>  
> @@ -662,25 +662,44 @@ gboolean is_valid_pin(const char *pin, enum pin_type type)
>  		return FALSE;
>  
>  	switch (type) {
> -	case PIN_TYPE_PIN:
> +	case OFONO_SIM_PASSWORD_SIM_PIN:
> +	case OFONO_SIM_PASSWORD_SIM_PIN2:
>  		/* 11.11 Section 9.3 ("CHV"): 4..8 IA-5 digits */
>  		if (4 <= i && i <= 8)
>  			return TRUE;
>  		break;
> -	case PIN_TYPE_PUK:
> +	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 */
> +		if (4 <= i && i <= 16)
> +			return TRUE;
> +		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 */
>  		if (i == 8)
>  			return TRUE;
>  		break;
> -	case PIN_TYPE_NET:
> +	case OFONO_SIM_PASSWORD_PIN_TYPE_NET:
>  		/* 22.004 Section 5.2, 4 IA-5 digits */
>  		if (i == 4)
>  			return TRUE;
>  		break;
> -	case PIN_TYPE_NONE:
> +	case OFONO_SIM_PASSWORD_NONE:
>  		if (i < 8)
>  			return TRUE;
>  		break;
> +	case OFONO_SIM_PASSWORD_INVALID:
> +		break;
>  	}
>  
>  	return FALSE;
> diff --git a/src/common.h b/src/common.h
> index 09f2deb..acdbce5 100644
> --- a/src/common.h
> +++ b/src/common.h
> @@ -19,6 +19,8 @@
>   *
>   */
>  
> +#include "ofono.h"
> +

Please don't do that, common.h is supposed to be semi-independent from
the rest of the core so it can be unit-tested separately.  I'm only
allowing inclusion of types.h here.  Maybe this is a bad idea, and I
will change my mind later, but for now I'd like to stick to this.

>  /* 27.007 Section 7.3 <AcT> */
>  enum access_technology {
>  	ACCESS_TECHNOLOGY_GSM =			0,
> @@ -122,13 +124,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,7 +157,7 @@ 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);
> +gboolean is_valid_pin(const char *pin, enum ofono_sim_password_type type);
>  
>  const char *registration_status_to_string(int status);
>  const char *registration_tech_to_string(int tech);
> diff --git a/src/ofono.h b/src/ofono.h
> index 6ba0187..ddd1bb9 100644
> --- a/src/ofono.h
> +++ b/src/ofono.h
> @@ -18,6 +18,8 @@
>   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>   *
>   */
> +#ifndef OFONO_H
> +#define OFONO_H
>  

Please don't do this.  We actually leave out the include guards for a
reason.  Besides, this has no bearing on this patch.

>  #include <glib.h>
>  
> @@ -430,3 +432,4 @@ ofono_bool_t __ofono_gprs_provision_get_settings(const char *mcc,
>  void __ofono_gprs_provision_free_settings(
>  				struct ofono_gprs_provision_data *settings,
>  				int count);
> +#endif
> diff --git a/src/sim.c b/src/sim.c
> index 41d7e1d..42d0f39 100644
> --- a/src/sim.c
> +++ b/src/sim.c
> @@ -174,6 +174,7 @@ static gboolean password_is_pin(enum ofono_sim_password_type type)
>  	case OFONO_SIM_PASSWORD_PHCORP_PUK:
>  	case OFONO_SIM_PASSWORD_INVALID:
>  	case OFONO_SIM_PASSWORD_NONE:
> +	case OFONO_SIM_PASSWORD_PIN_TYPE_NET:
>  		return FALSE;
>  	}
>  
> @@ -675,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 (!is_valid_pin(pin, type))
>  		return __ofono_error_invalid_format(msg);
>  
>  	sim->pending = dbus_message_ref(msg);
> @@ -747,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 (!is_valid_pin(old, type))
>  		return __ofono_error_invalid_format(msg);
>  
> -	if (!is_valid_pin(new, PIN_TYPE_PIN))
> +	if (!is_valid_pin(new, type))
>  		return __ofono_error_invalid_format(msg);
>  
>  	if (!strcmp(new, old))
> @@ -802,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 (!is_valid_pin(pin, type))
>  		return __ofono_error_invalid_format(msg);
>  
>  	sim->pending = dbus_message_ref(msg);
> @@ -1012,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 (!is_valid_pin(puk, type))
>  		return __ofono_error_invalid_format(msg);
>  
> -	if (!is_valid_pin(pin, PIN_TYPE_PIN))
> +	type = puk2pin(type);
> +
> +	if (!is_valid_pin(pin, type))
>  		return __ofono_error_invalid_format(msg);
>  
>  	sim->pending = dbus_message_ref(msg);

Regards,
-Denis

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] sim: enable usage of SIM pass codes longer than 8 digits
@ 2011-02-08 12:48 Jussi Kangas
  2011-02-08 16:22 ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Jussi Kangas @ 2011-02-08 12:48 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 9622 bytes --]

---


Hi,

On Tue, 2011-02-08 at 06:17 +0200, Denis Kenzior wrote:

Why don't we keep things simple.  Modify is_valid_pin to take a pin and
> a min and max number of digits.
> 
> gboolean is_valid_pin_with_limits(const char *pin, int min, int max)
> (feel free to pick some better name)
> 
> Then just add two functions:
> 
> __ofono_valid_net_pin(const char *pin)
> __ofono_valid_sim_pin(const char *pin, enum ofono_sim_password_type type)
> 
> Stick both in ofono.h / sim.c somewhere
> 

Right. Here it is. 

Br,
Jussi

 src/call-barring.c |   12 ++++----
 src/call-meter.c   |    4 +-
 src/common.c       |   37 -------------------------
 src/common.h       |    9 ------
 src/ofono.h        |    5 +++
 src/sim.c          |   76 +++++++++++++++++++++++++++++++++++++++++++++++----
 6 files changed, 83 insertions(+), 60 deletions(-)

diff --git a/src/call-barring.c b/src/call-barring.c
index 649826e..384eb43 100644
--- a/src/call-barring.c
+++ b/src/call-barring.c
@@ -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);
diff --git a/src/call-meter.c b/src/call-meter.c
index d483e2e..0789935 100644
--- a/src/call-meter.c
+++ b/src/call-meter.c
@@ -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);
diff --git a/src/common.c b/src/common.c
index f25f105..247fff0 100644
--- a/src/common.c
+++ b/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) {
diff --git a/src/common.h b/src/common.h
index 09f2deb..6dc7bff 100644
--- a/src/common.h
+++ b/src/common.h
@@ -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);
diff --git a/src/ofono.h b/src/ofono.h
index 6ba0187..4f0b7c2 100644
--- a/src/ofono.h
+++ b/src/ofono.h
@@ -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,
diff --git a/src/sim.c b/src/sim.c
index 3350166..3462608 100644
--- a/src/sim.c
+++ b/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,65 @@ 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);
+}
+
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] sim: enable usage of SIM pass codes longer than 8 digits
  2011-02-08 12:48 [PATCH] sim: enable usage of SIM pass codes longer than 8 digits Jussi Kangas
@ 2011-02-08 16:22 ` Denis Kenzior
  0 siblings, 0 replies; 4+ messages in thread
From: Denis Kenzior @ 2011-02-08 16:22 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 891 bytes --]

Hi Jussi,

On 02/08/2011 06:48 AM, Jussi Kangas wrote:
> ---
> 
> 
> Hi,
> 
> On Tue, 2011-02-08 at 06:17 +0200, Denis Kenzior wrote:
> 
> Why don't we keep things simple.  Modify is_valid_pin to take a pin and
>> a min and max number of digits.
>>
>> gboolean is_valid_pin_with_limits(const char *pin, int min, int max)
>> (feel free to pick some better name)
>>
>> Then just add two functions:
>>
>> __ofono_valid_net_pin(const char *pin)
>> __ofono_valid_sim_pin(const char *pin, enum ofono_sim_password_type type)
>>
>> Stick both in ofono.h / sim.c somewhere
>>
> 
> Right. Here it is. 

I applied your patch, but it did have multiple problems, namely blank
line at EOF in sim.c, mixing tab/space for indentation and a compilation
warning.  I was nice enough and fixed all these for you, but please pay
attention to this the next time.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-02-08 16:22 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-08 12:48 [PATCH] sim: enable usage of SIM pass codes longer than 8 digits Jussi Kangas
2011-02-08 16:22 ` Denis Kenzior
  -- strict thread matches above, loose matches on Subject: below --
2011-02-07 14:49 Jussi Kangas
2011-02-08  4:17 ` Denis Kenzior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.