#include "session.h" #include "curl_util.h" matrix_session* matrix_session_new(const char *url) { matrix_session *sess = (matrix_session*)malloc(sizeof(matrix_session)); memset(sess, 0, sizeof(matrix_session)); sess->curl = curl_easy_init(); if (sess->curl) { sess->url = copy_str(url); return sess; } else { free(sess); return NULL; } } #define SAFE_FREE(x) if (x) free(x); void matrix_session_free(matrix_session *sess) { SAFE_FREE(sess->url); SAFE_FREE(sess->servername); SAFE_FREE(sess->mxid); SAFE_FREE(sess->token); SAFE_FREE(sess->dev_id); curl_easy_cleanup(sess->curl); free(sess); } matrix_session* matrix_login_pass(const char *url, const char *user, const char *passwd, const char *devname) { CURLcode res; matrix_session *sess = matrix_session_new(url); json_object *reqobj = json_object_new_object(); char requrl[1000]; /* FIXME */ json_object *resp = NULL; sprintf(requrl, "%s%s", url, "/_matrix/client/r0/login"); json_add_string(reqobj, "type", "m.login.password"); json_add_string(reqobj, "user", user); json_add_string(reqobj, "password", passwd); if (devname != NULL) json_add_string(reqobj, "initial_device_display_name", devname); res = _curl_post(sess->curl, requrl, json_object_to_json_string(reqobj), &resp); json_object_put(reqobj); /* save mxid, token, dev_id*/ if (resp != NULL) { const char *mxid = json_gets(resp, "user_id"); const char *token = json_gets(resp, "access_token"); const char *devid = json_gets(resp, "device_id"); const char *hs = json_gets(resp, "home_server"); if (mxid && token && devid && hs) { sess->mxid = copy_str(mxid); sess->token = copy_str(token); sess->dev_id = copy_str(devid); sess->servername = copy_str(hs); json_object_put(resp); return sess; } else { json_object_put(resp); matrix_session_free(sess); return NULL; } } return NULL; } matrix_session* matrix_access_token(const char *url, const char *token) { matrix_session *sess = matrix_session_new(url); sess->token = copy_str(token); char *mxid = matrix_whoami(sess); if (mxid) { sess->mxid = mxid; return sess; } else { matrix_session_free(sess); return NULL; } } /* return an alloc'd string of MXID */ char *matrix_whoami(matrix_session *sess) { char requrl[1000]; /* FIXME */ char *uid; CURLcode res; json_object *resp = NULL; sprintf(requrl, "%s/_matrix/client/r0/account/whoami?access_token=%s", sess->url, sess->token); res = _curl_get(sess->curl, requrl, &resp); if (resp != NULL) { const char *mxid = json_gets(resp, "user_id"); if (mxid) { uid = copy_str(mxid); json_object_put(resp); return uid; } else { json_object_put(resp); return NULL; } } else { return NULL; } }