summaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'session.c')
-rw-r--r--session.c120
1 files changed, 120 insertions, 0 deletions
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;
+ }
+}