From e6d9edc048efb5b19d79bbe7871b2ff779d72311 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Wed, 27 Jun 2018 22:56:25 +0800 Subject: initial code --- session.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 session.c (limited to 'session.c') diff --git a/session.c b/session.c new file mode 100644 index 0000000..bd9deb0 --- /dev/null +++ b/session.c @@ -0,0 +1,120 @@ +#include "session.h" +#include "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; + } +} -- cgit v1.2.3