diff --git a/common.c b/common.c
index 7e429dd09c3772cc4088be2a06ace5abc55e41a4..7284aa407dac279adc6596aab845b699081e9e8f 100644
--- a/common.c
+++ b/common.c
@@ -190,7 +190,7 @@ fail:
return -1;
}
-int pin_status(struct blob_buf *bb)
+int pin_status(struct blob_buf *bb, char *ip_addr)
{
struct json_object *response, *rv_json;
int rv;
@@ -223,6 +223,8 @@ fail_result:
int check_response(struct json_object *response)
{
+ struct json_object *rv_json;
+
json_object_object_get_ex(response, "result", &rv_json);
if (!rv_json) {
debug_print("no result available in response!\n");
diff --git a/common.h b/common.h
index 56e4391c4ba2534530865232c1936a5c5a6736c0..6fb0dbe9c9ea77255078d7258a06451f6c13bba3 100644
--- a/common.h
+++ b/common.h
@@ -80,6 +80,6 @@ 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 pin_status(struct blob_buf *bb, char *ip_addr);
int check_response(struct json_object *response);
#endif
diff --git a/dongle_infrastructure.c b/dongle_infrastructure.c
index c715a77ca4c8b4886c357da1c969bc3c1aa933bb..e1fe8bd54802806a406b7f788f8ae26213defe07 100644
--- a/dongle_infrastructure.c
+++ b/dongle_infrastructure.c
@@ -55,7 +55,7 @@ int set_pin(struct ubus_context *ctx, struct ubus_object *obj,
struct blob_buf bb;
char *new_pin, *current_pin, *ip_addr;
int rv;
- struct json_object *response, *rv_json;
+ struct json_object *response;
blobmsg_parse(set_pin_policy, __SET_PIN_MAX, tb, blob_data(msg), blob_len(msg));
@@ -82,7 +82,7 @@ int set_pin(struct ubus_context *ctx, struct ubus_object *obj,
goto fail_input;
}
- if (!pin_status(&bb)) {
+ if (!pin_status(&bb, ip_addr)) {
debug_print("pin disabled!");
ubus_send_reply(ctx, req, bb.head);
goto disabled;
@@ -122,9 +122,10 @@ int disable_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, *rv_json;
+ struct json_object *response;
blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
@@ -143,9 +144,9 @@ int disable_pin(struct ubus_context *ctx, struct ubus_object *obj,
goto fail_input;
}
- if (!pin_status()) {
+ if (!pin_status(&bb, ip_addr)) {
debug_print("pin already disabled!\n");
- goto disabled:
+ goto disabled;
}
response = mobile_disable_pin(ip_addr, pin);
@@ -156,7 +157,7 @@ int disable_pin(struct ubus_context *ctx, struct ubus_object *obj,
rv = check_response(response);
if (rv < 0) {
- deub_print("incorrect pin!\n");
+ debug_print("incorrect pin!\n");
goto fail_input_response;
}
@@ -181,9 +182,10 @@ int enable_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, *rv_json;
+ struct json_object *response;
blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
@@ -203,7 +205,7 @@ int enable_pin(struct ubus_context *ctx, struct ubus_object *obj,
goto fail_input;
}
- if (pin_status()) {
+ if (pin_status(&bb, ip_addr)) {
debug_print("pin already enabled");
goto enabled;
}
@@ -216,8 +218,8 @@ int enable_pin(struct ubus_context *ctx, struct ubus_object *obj,
rv = check_response(response);
if (rv < 0) {
- deub_print("incorrect pin!\n");
- goto fail_input;
+ debug_print("incorrect pin!\n");
+ goto fail_input_response;
}
enabled:
@@ -263,7 +265,7 @@ int verify_pin(struct ubus_context *ctx, struct ubus_object *obj,
goto fail_input;
}
- if (!pin_status(&bb)) {
+ if (!pin_status(&bb, ip_addr)) {
debug_print("pin disabled");
ubus_send_reply(ctx, req, bb.head);
goto disabled;
diff --git a/dongle_pin.c b/dongle_pin.c
index fbad0dad8d3255e2dc3a175e5717b0e1867a2fcc..557385818ab113d0f5d514aec024ecec01e1169b 100644
--- a/dongle_pin.c
+++ b/dongle_pin.c
@@ -1,399 +1,2 @@
#include "dongle_pin.h"
-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;
-
- blobmsg_parse(set_pin_policy, __SET_PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
- ip_addr = strdup("192.168.0.1");
- if (!ip_addr)
- goto fail_strdup;
-
- if (!tb[NEW_PIN] && !tb[CURRENT_PIN]) {
- debug_print("Please enter both a new pin and old pin!\n");
- goto fail_input;
- }
- new_pin = (char *)blobmsg_data(tb[NEW_PIN]);
- current_pin = (char *)blobmsg_data(tb[CURRENT_PIN]);
-
- rv = validate_pin_format(new_pin);
- if (rv > 0) {
- debug_print("invalid pin format\n");
- goto fail_input;
- }
-
- rv = validate_pin_format(current_pin);
- if (rv > 0) {
- debug_print("invalid pin format\n");
- 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, current_pin, new_pin);
- if (!response) {
- debug_print("error setting pin!\n");
- goto fail_data;
- }
-
- rv = check_response(response);
- if (rv < 0) {
- debug_print("incorrect pin!\n");
- goto fail_input_json;
- }
-
- 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_strdup:
- return UBUS_STATUS_UNKNOWN_ERROR;
-disabled:
- free(ip_addr);
- return 0;
-}
-
-int disable_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[__PIN_MAX];
- char *pin, *ip_addr;
- int rv;
- struct json_object *response, *rv_json;
-
- blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
- ip_addr = strdup("192.168.0.1");
- if (!ip_addr)
- goto fail_strdup;
-
- if (!tb[PIN]) {
- debug_print("Please enter a pin!\n");
- goto fail_input;
- }
- pin = (char *)blobmsg_data(tb[PIN]);
- rv = validate_pin_format(pin);
- if (rv < 0) {
- debug_print("invalid pin format!\n");
- goto fail_input;
- }
-
- if (!pin_status()) {
- debug_print("pin already disabled!\n");
- goto disabled:
- }
-
- response = mobile_disable_pin(ip_addr, pin);
- if (!response) {
- debug_print("error disabling pin!\n");
- goto fail_data;
- }
-
- rv = check_response(response);
- if (rv < 0) {
- deub_print("incorrect pin!\n");
- goto fail_input_response;
- }
-
-disabled:
- free(ip_addr);
- 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_strdup:
- free(ip_addr);
- return UBUS_STATUS_UNKNOWN_ERROR;
-}
-
-int pin_status(*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;
-}
-
-int enable_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[__PIN_MAX];
- char *pin, *ip_addr;
- int rv;
- struct json_object *response, *rv_json;
-
- blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
- ip_addr = strdup("192.168.0.1");
- if (!ip_addr)
- goto fail_strdup;
-
- if (!tb[PIN]) {
- debug_print("Please enter both a new pin and old pin!\n");
- goto fail_input;
- }
-
- pin = (char *)blobmsg_data(tb[PIN]);
- rv = validate_pin_format(pin);
- if (rv < 0) {
- debug_print("invalid pin format!\n");
- goto fail_input;
- }
-
- if (pin_status()) {
- debug_print("pin already enabled");
- goto enabled;
- }
-
- response = mobile_enable_pin(ip_addr, pin);
- if (!response) {
- debug_print("no response from get_pin_status!\n");
- goto fail_data;
- }
-
- rv = check_response(response);
- if (rv < 0) {
- deub_print("incorrect pin!\n");
- goto fail_input;
- }
-
-enabled:
- free(ip_addr);
- 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_strdup:
- return UBUS_STATUS_UNKNOWN_ERROR;
-}
-
-int verify_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[__PIN_MAX];
- struct blob_buf bb;
- char *pin, *ip_addr;
- int rv;
- struct json_object *response;
-
- blobmsg_parse(pin_policy, __PIN_MAX, tb, blob_data(msg), blob_len(msg));
-
- ip_addr = strdup("192.168.0.1");
- if (!ip_addr)
- goto fail_strdup;
-
- if (!tb[PIN]) {
- debug_print("Please enter a pin\n!");
- goto fail_input;
- }
-
- pin = (char *)blobmsg_data(tb[PIN]);
- rv = validate_pin_format(pin);
- if (rv < 0) {
- debug_print("invalid pin format!\n");
- 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;
-
- free(ip_addr);
- return print_to_ubus(response, ctx, req);
-fail_input:
- free(ip_addr);
- return UBUS_STATUS_INVALID_ARGUMENT;
-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,
- struct ubus_request_data *req, const char *method,
- struct blob_attr *msg)
-{
- char *ip_addr;
- struct json_object *response;
-
- 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;
-
- free(ip_addr);
- return print_to_ubus(response, ctx, req);
-fail_unknown:
- free(ip_addr);
-fail_strdup:
- return UBUS_STATUS_UNKNOWN_ERROR;
-}
-
-int unlock_sim(struct ubus_context *ctx, struct ubus_object *obj,
- struct ubus_request_data *req, const char *method,
- struct blob_attr *msg)
-{
- struct blob_attr *tb[__UNLOCK_MAX];
- char *pin, *puk, *ip_addr;
- struct json_object *response;
- int rv;
-
- ip_addr = strdup("192.168.0.1");
- if (!ip_addr)
- goto fail_strdup;
-
- if (!tb[PUK] || !tb[UNLOCK_PIN]) {
- debug_print("Please enter both a pin and a puk code!\n");
- goto fail_input;
- }
- puk = (char *)blobmsg_data(tb[PUK]);
- pin = (char *)blobmsg_data(tb[UNLOCK_PIN]);
-
- rv = validate_pin_format(pin);
- if (rv < 0)
- goto fail_input;
-
- rv = validate_puk_format(puk);
- if (rv < 0)
- goto fail_input;
-
- response = mobile_unlock_sim(ip_addr, puk, pin);
- if (!response)
- goto fail_unknown;
-
- free(ip_addr);
- return print_to_ubus(response, ctx, req);
-fail_input:
- free(ip_addr);
- return UBUS_STATUS_INVALID_ARGUMENT;
-fail_unknown:
- free(ip_addr);
-fail_strdup:
- return UBUS_STATUS_UNKNOWN_ERROR;
-}