From 1bec937076d8d40f94ff4603479f21bca2de6c61 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Sun, 4 Aug 2019 11:03:38 +0200 Subject: Added http lib and basic restapi with rocket_close_im binary --- restapi/auth.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 restapi/auth.c (limited to 'restapi/auth.c') diff --git a/restapi/auth.c b/restapi/auth.c new file mode 100644 index 0000000..e3f1b74 --- /dev/null +++ b/restapi/auth.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +#include "auth.h" +#include "common/config.h" +#include "common/http.h" + +#define USER_STR "user=" +#define PASS_STR "&password=" + +char // returns 0 if ok, greater than 0 otherwise +restapi_login(const char* username, const char* password) +{ + char ret = 0; + http_init(); + size_t user_str_len = strlen(USER_STR); + size_t user_len = strlen(username); + size_t pass_str_len = strlen(PASS_STR); + size_t pass_len = strlen(password); + char* login_args = malloc(user_str_len + user_len + pass_str_len + pass_len + 1); + strcpy(login_args, USER_STR); + strcpy(login_args + user_str_len, username); + strcpy(login_args + user_str_len + user_len, PASS_STR); + strcpy(login_args + user_str_len + user_len + pass_str_len, password); + const char* buffer = http_post("/api/v1/login", login_args); + free(login_args); + if (buffer == NULL) { + fprintf(stderr, "Error while authenticating, http post didn't return any data.\n"); + return 1; + } + + cJSON* json = cJSON_Parse(buffer); + if (json == NULL) { + const char *error_ptr = cJSON_GetErrorPtr(); + if (error_ptr != NULL) + fprintf(stderr, "Json parsing error before: %s\n", error_ptr); + fprintf(stderr, "Error while authenticating, couldn't parse json output :\n%s\n", buffer); + ret = 2; + goto login_json_cleanup; + } + + const cJSON* status = cJSON_GetObjectItemCaseSensitive(json, "status"); + if (cJSON_IsString(status) && status->valuestring != NULL && strcmp(status->valuestring, "success") == 0) { + cJSON* data = cJSON_GetObjectItemCaseSensitive(json, "data"); + if (!cJSON_IsObject(data)) { + fprintf(stderr, "Error while authenticating, couldn't parse json output :\n%s\n", buffer); + ret = 4; + goto login_json_cleanup; + } + cJSON* userId = cJSON_GetObjectItemCaseSensitive(data, "userId"); + cJSON* authToken = cJSON_GetObjectItemCaseSensitive(data, "authToken"); + if (!cJSON_IsString(userId) || userId->valuestring == NULL || !cJSON_IsString(authToken) || authToken->valuestring == NULL) { + fprintf(stderr, "Error while authenticating, couldn't parse json output :\n%s\n", buffer); + ret = 5; + goto login_json_cleanup; + } + + printf("userid: %s\nauthtoken: %s\n", userId->valuestring, authToken->valuestring); + http_add_header("X-User-Id", userId->valuestring); + http_add_header("X-Auth-Token", authToken->valuestring); + } else { + const cJSON* msg = cJSON_GetObjectItemCaseSensitive(json, "message"); + if (cJSON_IsString(msg) && msg->valuestring != NULL) + fprintf(stderr, "Error while authenticating: %s\n", msg->valuestring); + else + fprintf(stderr, "Error while authenticating.\n%s\n", buffer); + ret = 3; + } +login_json_cleanup: + cJSON_Delete(json); + return ret; +} + +void restapi_logout(void) +{ + (void) http_post("/api/v1/logout", NULL); + http_clean(); +} -- cgit v1.2.3