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
|
#include "matrix.h"
#include <mjson.h>
#define LOGIN_REQUEST_SIZE 1024
#define LOGIN_RESPONSE_SIZE 1024
#define LOGIN_URL "/_matrix/client/v3/login"
bool
MatrixClientInit(
MatrixClient * client,
char * server, int serverLen
) {
strcpy_s(
client->server,
SERVER_SIZE,
server
);
client->serverLen = serverLen;
return true;
}
// https://spec.matrix.org/v1.6/client-server-api/#post_matrixclientv3login
bool
MatrixClientLoginPassword(
MatrixClient * client,
char * username, int usernameLen,
char * password, int passwordLen,
char * displayName, int displayNameLen
) {
static char requestBuffer[LOGIN_REQUEST_SIZE];
int requestLen =
mjson_snprintf(requestBuffer, LOGIN_REQUEST_SIZE,
"{"
"\"type\": \"m.login.password\","
"\"identifier\": {"
"\"type\": \"m.id.user\","
"\"user\": \"%.*s\""
"},"
"\"password\": \"%.*s\","
"\"initial_device_display_name\": \"%.*s\""
"}",
usernameLen, username,
passwordLen, password,
displayNameLen, displayName);
static char responseBuffer[LOGIN_RESPONSE_SIZE];
int responseLen;
bool result =
MatrixHttpPost(client,
LOGIN_URL,
requestBuffer, requestLen,
responseBuffer, LOGIN_RESPONSE_SIZE, &responseLen);
if (!result)
return false;
client->accessTokenLen =
mjson_get_string(responseBuffer, responseLen,
"$.access_token",
client->accessTokenBuffer, ACCESS_TOKEN_SIZE);
client->deviceIdLen =
mjson_get_string(responseBuffer, responseLen,
"$.device_id",
client->deviceIdBuffer, DEVICE_ID_SIZE);
client->expireMsLen =
mjson_get_string(responseBuffer, responseLen,
"$.expires_in_ms",
client->expireMsBuffer, EXPIRE_MS_SIZE);
client->refreshTokenLen =
mjson_get_string(responseBuffer, responseLen,
"$.refresh_token",
client->refreshTokenBuffer, REFRESH_TOKEN_SIZE);
return true;
}
|