From c05283f9dc7df8174d8fdd79c40aa229ca5c5fd8 Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakobols@kth.se> Date: Tue, 5 Jun 2018 11:45:32 +0200 Subject: [PATCH] move logic from dongle_infrastructure to common --- common.c | 89 ++++++++++++++++++ common.h | 5 + dongle_infrastructure.c | 202 +++++++++------------------------------- 3 files changed, 140 insertions(+), 156 deletions(-) diff --git a/common.c b/common.c index 8e31a23..7e429dd 100644 --- a/common.c +++ b/common.c @@ -147,3 +147,92 @@ void xml_to_json_converter(struct write_result *result) debug_print("The json object created: %s\n", json_object_to_json_string(jobj)); } + +int isdigits(const char *pin) +{ + while (*pin) { + if (isdigit(*pin++) == 0) + return false; + } + return true; +} + +int validate_puk_format(char *puk) +{ + if (!isdigits(puk)) { + debug_print("Please enter digits only!\n"); + goto fail; + } else if (strlen(puk) == 8) { + debug_print("Please enter 8 digits!\n"); + goto fail; + } + + return 0; +fail: + return -1; +} + +int validate_pin_format(char *pin) +{ + if (!isdigits(pin)) { + debug_print("Please enter digits only!\n"); + goto fail; + } else if (strlen(pin) > 8 || strlen(pin) < 4) { + debug_print("Please enter between 4 to 8 digits!\n"); + goto fail; + } else if (atoi(pin) == 0) { + debug_print("0000 is not a valid pin! Lowest available is 0001\n"); + goto fail; + } + + return 0; +fail: + return -1; +} + +int pin_status(struct blob_buf *bb) +{ + struct json_object *response, *rv_json; + int rv; + + response = mobile_get_pin_status(ip_addr); + if (!response) { + debug_print("no response from get_pin_status!\n"); + goto fail_response; + } + + json_object_object_get_ex(response, "pin_status", &rv_json); + if (!rv_json) { + debug_print("no pin_status available in response!\n"); + goto fail_result; + } + + rv = json_object_get_int(rv_json); + if (rv == 0) + blobmsg_add_string(bb, "Failure", "Pin disabled"); + else + blobmsg_add_string(bb, "Failure", "Pin enabled"); + + json_object_put(response); + return rv; +fail_response: +fail_result: + json_object_put(response); + return -1; +} + +int check_response(struct json_object *response) +{ + json_object_object_get_ex(response, "result", &rv_json); + if (!rv_json) { + debug_print("no result available in response!\n"); + goto fail; + } + + if (strncmp(json_object_get_string(rv_json), "failure", strlen("failure")) == 0) + goto fail; + + return 0; +fail: + return -1; +} \ No newline at end of file diff --git a/common.h b/common.h index 9d447c7..56e4391 100644 --- a/common.h +++ b/common.h @@ -77,4 +77,9 @@ struct blob_buf json_to_blob(struct json_object *response, struct blob_buf bb); char *xml_parser(struct write_result *result, char *tag); void xml_to_json_converter(struct write_result *result); +int isdigits(const char *pin); +int validate_puk_format(char *puk); +int validate_pin_format(char *pin); +int pin_status(struct blob_buf *bb); +int check_response(struct json_object *response); #endif diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c index deb7e9c..c715a77 100644 --- a/dongle_infrastructure.c +++ b/dongle_infrastructure.c @@ -44,60 +44,15 @@ const struct blobmsg_policy create_apn_policy[__CREATE_MAX] = { [PDP_TYPE] = {.name = "pdp_type", .type = BLOBMSG_TYPE_STRING} }; - //dynamic object callbacks.. //dongle pin.. -static int isdigits(const char *pin); -static int validate_pin_format(char *pin); - -static int isdigits(const char *pin) -{ - while (*pin) { - if (isdigit(*pin++) == 0) - return false; - } - return true; -} - -static int validate_puk_format(char *puk) -{ - if (!isdigits(puk)) { - debug_print("Please enter digits only!\n"); - goto fail; - } else if (strlen(puk) == 8) { - debug_print("Please enter 8 digits!\n"); - goto fail; - } - - return 0; -fail: - return -1; -} - -static int validate_pin_format(char *pin) -{ - if (!isdigits(pin)) { - debug_print("Please enter digits only!\n"); - goto fail; - } else if (strlen(pin) > 8 || strlen(pin) < 4) { - debug_print("Please enter between 4 to 8 digits!\n"); - goto fail; - } else if (atoi(pin) == 0) { - debug_print("0000 is not a valid pin! Lowest available is 0001\n"); - goto fail; - } - - return 0; -fail: - return -1; -} - int set_pin(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { struct blob_attr *tb[__SET_PIN_MAX]; + struct blob_buf bb; char *new_pin, *current_pin, *ip_addr; int rv; struct json_object *response, *rv_json; @@ -127,70 +82,39 @@ int set_pin(struct ubus_context *ctx, struct ubus_object *obj, goto fail_input; } - response = mobile_get_pin_status(ip_addr); - if (!response) { - debug_print("error getting pin_status\n"); - goto fail_data; - } - - json_object_object_get_ex(response, "pin_status", &rv_json); - if (!rv_json) { - debug_print("no pin_status available\n"); - goto fail_result; - } - - /* Enable PIN if it is disabled */ - if (!json_object_get_int(rv_json)) { - json_object_put(response); - - response = mobile_enable_pin(ip_addr, current_pin); - if (!response) { - debug_print("error enabling pin!\n"); - goto fail_unknown; - } - - json_object_object_get_ex(response, "result", &rv_json); - if (!rv_json) { - debug_print("error getting result!\n"); - goto fail_result; - } - - if (strncmp(json_object_get_string(rv_json), "failure", strlen("failure")) == 0) { - debug_print("Incorrect pin!\n"); - goto incorrect_pin; - } + if (!pin_status(&bb)) { + debug_print("pin disabled!"); + ubus_send_reply(ctx, req, bb.head); + goto disabled; } - json_object_put(response); response = mobile_set_pin(ip_addr, current_pin, new_pin); if (!response) { debug_print("error setting pin!\n"); goto fail_data; } - json_object_object_get_ex(response, "result", &rv_json); - if (!rv_json) { - debug_print("no result available from %s!", __func__); - goto fail_result; + rv = check_response(response); + if (rv < 0) { + debug_print("incorrect pin!\n"); + goto fail_input_json; } -incorrect_pin: free(ip_addr); return print_to_ubus(response, ctx, req); +fail_input_json: + json_object_put(response); fail_input: free(ip_addr); return UBUS_STATUS_INVALID_ARGUMENT; fail_data: free(ip_addr); return UBUS_STATUS_NO_DATA; -fail_result: - free(ip_addr); - json_object_put(response); - return UBUS_STATUS_UNKNOWN_ERROR; -fail_unknown: - free(ip_addr); fail_strdup: return UBUS_STATUS_UNKNOWN_ERROR; +disabled: + free(ip_addr); + return 0; } int disable_pin(struct ubus_context *ctx, struct ubus_object *obj, @@ -219,52 +143,36 @@ int disable_pin(struct ubus_context *ctx, struct ubus_object *obj, goto fail_input; } - response = mobile_get_pin_status(ip_addr); - if (!response) { - debug_print("no response from get_pin_status!\n"); - goto fail_data; - } - - json_object_object_get_ex(response, "pin_status", &rv_json); - if (!rv_json) { - debug_print("no pin_status available in response!\n"); - goto fail_result; + if (!pin_status()) { + debug_print("pin already disabled!\n"); + goto disabled: } - if (!json_object_get_int(rv_json)) { - debug_print("already disabled!\n"); - goto success; //kind of... - } - - json_object_put(response); response = mobile_disable_pin(ip_addr, pin); if (!response) { debug_print("error disabling pin!\n"); goto fail_data; } - json_object_object_get_ex(response, "result", &rv_json); - if (!rv_json) { - debug_print("no result available in response!\n"); - goto fail_result; + rv = check_response(response); + if (rv < 0) { + deub_print("incorrect pin!\n"); + goto fail_input_response; } - if (strncmp(json_object_get_string(rv_json), "failure", strlen("failure")) == 0) - debug_print("Incorrect pin!\n"); - -success: +disabled: free(ip_addr); - return print_to_ubus(response, ctx, req); + return 0; +fail_input_response: + json_object_put(response); fail_input: free(ip_addr); return UBUS_STATUS_INVALID_ARGUMENT; fail_data: free(ip_addr); return UBUS_STATUS_NO_DATA; -fail_result: - free(ip_addr); - json_object_put(response); fail_strdup: + free(ip_addr); return UBUS_STATUS_UNKNOWN_ERROR; } @@ -295,50 +203,34 @@ int enable_pin(struct ubus_context *ctx, struct ubus_object *obj, goto fail_input; } - response = mobile_get_pin_status(ip_addr); - if (!response) { - debug_print("no response from get_pin_status!\n"); - goto fail_data; - } - - json_object_object_get_ex(response, "pin_status", &rv_json); - if (!rv_json) { - debug_print("no pin_status available in response!\n"); - goto fail_result; - } - if (!json_object_get_int(rv_json)) { - debug_print("already enabled!\n"); - goto success; + if (pin_status()) { + debug_print("pin already enabled"); + goto enabled; } - json_object_put(response); response = mobile_enable_pin(ip_addr, pin); if (!response) { debug_print("no response from get_pin_status!\n"); goto fail_data; } - json_object_object_get_ex(response, "result", &rv_json); - if (!rv_json) { - debug_print("no result available in response!\n"); - goto fail_result; + rv = check_response(response); + if (rv < 0) { + deub_print("incorrect pin!\n"); + goto fail_input; } - if (strncmp(json_object_get_string(rv_json), "failure", strlen("failure")) == 0) - debug_print("Incorrect pin!\n"); - -success: +enabled: free(ip_addr); - return print_to_ubus(response, ctx, req); + return 0; +fail_input_response: + json_object_put(response); fail_input: free(ip_addr); return UBUS_STATUS_INVALID_ARGUMENT; fail_data: free(ip_addr); return UBUS_STATUS_NO_DATA; -fail_result: - free(ip_addr); - json_object_put(response); fail_strdup: return UBUS_STATUS_UNKNOWN_ERROR; } @@ -348,6 +240,7 @@ int verify_pin(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct blob_attr *tb[__PIN_MAX]; + struct blob_buf bb; char *pin, *ip_addr; int rv; struct json_object *response; @@ -370,6 +263,12 @@ int verify_pin(struct ubus_context *ctx, struct ubus_object *obj, goto fail_input; } + if (!pin_status(&bb)) { + debug_print("pin disabled"); + ubus_send_reply(ctx, req, bb.head); + goto disabled; + } + response = mobile_set_pin(ip_addr, pin, pin); if (!response) goto fail_unknown; @@ -383,6 +282,8 @@ fail_unknown: free(ip_addr); fail_strdup: return UBUS_STATUS_UNKNOWN_ERROR; +disabled: + return 0; } int remaining_tries(struct ubus_context *ctx, struct ubus_object *obj, @@ -420,14 +321,6 @@ int unlock_sim(struct ubus_context *ctx, struct ubus_object *obj, ip_addr = strdup("192.168.0.1"); if (!ip_addr) goto fail_strdup; - /*response = mobile_get_remaining_tries(ip_addr); - if (!response) - goto fail_unknown; -*/ - /*json_object_object_get_ex(response, "pinnumber", &rv_json); - if (json_object_get_int(rv_json) > 0) - goto fail_unknown; -*/ blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg)); @@ -461,7 +354,6 @@ fail_strdup: return UBUS_STATUS_UNKNOWN_ERROR; } - int list_apn_profiles(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -805,8 +697,6 @@ fail_strdup: return UBUS_STATUS_UNKNOWN_ERROR; } - - struct ubus_method dynamic_object_methods[] = { UBUS_METHOD("set_pin", set_pin, set_pin_policy), //pin UBUS_METHOD("disable_pin", disable_pin, pin_policy), -- GitLab