summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhilip Paeps <philip@paeps.cx>2014-06-19 12:07:08 +0200
committerDenis Kenzior <denkenz@gmail.com>2014-06-21 11:58:03 -0500
commit73831c3d76163292aaff76ec407c21da149a6ce3 (patch)
treee8b29e588a7ec783e3920fc7a3552aab3f65cd6c /src
parent7011dcdf2f23a7e2ab67eb1e14537b15905865ad (diff)
downloadofono-73831c3d76163292aaff76ec407c21da149a6ce3.tar.bz2
gprs: make PPP authentication method configurable
Add a new "AuthenticationMethod" property to select between "pap" and "chap" PPP authentication, defaulting to "chap" (i.e.: previous behaviour).
Diffstat (limited to 'src')
-rw-r--r--src/gprs.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/gprs.c b/src/gprs.c
index e379f7ba..71280f24 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -264,6 +264,32 @@ static gboolean gprs_proto_from_string(const char *str,
return FALSE;
}
+static const char *gprs_auth_method_to_string(enum ofono_gprs_auth_method auth)
+{
+ switch (auth) {
+ case OFONO_GPRS_AUTH_METHOD_CHAP:
+ return "chap";
+ case OFONO_GPRS_AUTH_METHOD_PAP:
+ return "pap";
+ };
+
+ return NULL;
+}
+
+static gboolean gprs_auth_method_from_string(const char *str,
+ enum ofono_gprs_auth_method *auth)
+{
+ if (g_str_equal(str, "chap")) {
+ *auth = OFONO_GPRS_AUTH_METHOD_CHAP;
+ return TRUE;
+ } else if (g_str_equal(str, "pap")) {
+ *auth = OFONO_GPRS_AUTH_METHOD_PAP;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static unsigned int gprs_cid_alloc(struct ofono_gprs *gprs)
{
return idmap_alloc(gprs->cid_map);
@@ -807,6 +833,10 @@ static void append_context_properties(struct pri_context *ctx,
ofono_dbus_dict_append(dict, "Password", DBUS_TYPE_STRING,
&strvalue);
+ strvalue = gprs_auth_method_to_string(ctx->context.auth_method);
+ ofono_dbus_dict_append(dict, "AuthenticationMethod", DBUS_TYPE_STRING,
+ &strvalue);
+
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS) {
strvalue = ctx->message_proxy;
ofono_dbus_dict_append(dict, "MessageProxy",
@@ -1149,6 +1179,37 @@ static DBusMessage *pri_set_message_center(struct pri_context *ctx,
return NULL;
}
+static DBusMessage *pri_set_auth_method(struct pri_context *ctx,
+ DBusConnection *conn,
+ DBusMessage *msg, const char *str)
+{
+ GKeyFile *settings = ctx->gprs->settings;
+ enum ofono_gprs_auth_method auth;
+
+ if (gprs_auth_method_from_string(str, &auth) == FALSE)
+ return __ofono_error_invalid_format(msg);
+
+ if (ctx->context.auth_method == auth)
+ return dbus_message_new_method_return(msg);
+
+ ctx->context.auth_method = auth;
+
+ if (settings) {
+ g_key_file_set_string(settings, ctx->key,
+ "AuthenticationMethod", str);
+ storage_sync(ctx->gprs->imsi, SETTINGS_STORE, settings);
+ }
+
+ g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);
+
+ ofono_dbus_signal_property_changed(conn, ctx->path,
+ OFONO_CONNECTION_CONTEXT_INTERFACE,
+ "AuthenticationMethod",
+ DBUS_TYPE_STRING, &str);
+
+ return NULL;
+}
+
static DBusMessage *pri_set_property(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -1259,6 +1320,13 @@ static DBusMessage *pri_set_property(DBusConnection *conn,
dbus_message_iter_get_basic(&var, &str);
return pri_set_name(ctx, conn, msg, str);
+ } else if (!strcmp(property, "AuthenticationMethod")) {
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_STRING)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &str);
+
+ return pri_set_auth_method(ctx, conn, msg, str);
}
if (ctx->type != OFONO_GPRS_CONTEXT_TYPE_MMS)
@@ -1752,6 +1820,10 @@ static void write_context_settings(struct ofono_gprs *gprs,
"Username", context->context.username);
g_key_file_set_string(gprs->settings, context->key,
"Password", context->context.password);
+ g_key_file_set_string(gprs->settings, context->key,
+ "AuthenticationMethod",
+ gprs_auth_method_to_string(
+ context->context.auth_method));
g_key_file_set_string(gprs->settings, context->key, "Type",
gprs_context_type_to_string(context->type));
g_key_file_set_string(gprs->settings, context->key, "Protocol",
@@ -2698,11 +2770,13 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
char *apn = NULL;
char *msgproxy = NULL;
char *msgcenter = NULL;
+ char *authstr = NULL;
gboolean ret = FALSE;
gboolean legacy = FALSE;
struct pri_context *context;
enum ofono_gprs_context_type type;
enum ofono_gprs_proto proto;
+ enum ofono_gprs_auth_method auth;
unsigned int id;
if (sscanf(group, "context%d", &id) != 1) {
@@ -2747,6 +2821,14 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
if (password == NULL)
goto error;
+ authstr = g_key_file_get_string(gprs->settings, group,
+ "AuthenticationMethod", NULL);
+ if (authstr == NULL)
+ authstr = g_strdup("chap");
+
+ if (gprs_auth_method_from_string(authstr, &auth) == FALSE)
+ goto error;
+
if (strlen(password) > OFONO_GPRS_MAX_PASSWORD_LENGTH)
goto error;
@@ -2783,6 +2865,7 @@ static gboolean load_context(struct ofono_gprs *gprs, const char *group)
strcpy(context->context.password, password);
strcpy(context->context.apn, apn);
context->context.proto = proto;
+ context->context.auth_method = auth;
if (msgproxy != NULL)
strcpy(context->message_proxy, msgproxy);
@@ -2812,6 +2895,7 @@ error:
g_free(apn);
g_free(msgproxy);
g_free(msgcenter);
+ g_free(authstr);
return ret;
}