summaryrefslogtreecommitdiff
path: root/session.c
blob: 1d40b88b0cdff70ba44659aea4aed39e662910fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#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;
	}
}