"{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
args[1]);\r
\r
- printf("Sending %s to %s\n", body, args[0]);\r
-\r
MatrixClientSendEvent(client,\r
args[0],\r
"m.room.message",\r
else if (CheckCommand(cmd, "getuserid")) {\r
printf("User ID: %s\n", client->userId);\r
}\r
+ else if (CheckCommand(cmd, "sendencrypted")) {\r
+ CHECK_ARGS(2, "<room_id> <message>")\r
+\r
+ static char body[1024];\r
+ snprintf(body, 1024,\r
+ "{\"body\":\"%s\",\"msgtype\":\"m.text\"}",\r
+ args[1]);\r
+\r
+ MatrixClientSendEventEncrypted(client,\r
+ args[0],\r
+ "m.room.message",\r
+ body);\r
+ }\r
+ else if (CheckCommand(cmd, "sharesession")) {\r
+ CHECK_ARGS(2, "<user_id> <device_id>")\r
+\r
+ MatrixClientShareMegolmOutSession(&client,\r
+ args[0],\r
+ args[1],\r
+ &client->megolmOutSessions[0]);\r
+ }\r
+ else if (CheckCommand(cmd, "savesession")) {\r
+ CHECK_ARGS(2, "<filename> <key>")\r
+\r
+ MatrixMegolmOutSessionSave(\r
+ &client->megolmOutSessions[0],\r
+ args[0],\r
+ args[1]);\r
+ }\r
+ else if (CheckCommand(cmd, "loadsession")) {\r
+ CHECK_ARGS(2, "<filename> <key>")\r
+\r
+ MatrixMegolmOutSessionLoad(\r
+ &client->megolmOutSessions[0],\r
+ args[0],\r
+ args[1]);\r
+ }\r
#undef CHECK_ARGS\r
}\r
\r
return res != olm_error();\r
}\r
\r
+bool\r
+MatrixMegolmOutSessionSave(\r
+ MatrixMegolmOutSession * session,\r
+ const char * filename,\r
+ const char * key)\r
+{\r
+ FILE * f = fopen(filename, "w");\r
+\r
+ size_t roomIdLen = strlen(session->roomId);\r
+ fwrite(&roomIdLen, sizeof(size_t), 1, f);\r
+ fwrite(session->roomId, 1, roomIdLen, f);\r
+\r
+ size_t pickleBufferLen =\r
+ olm_pickle_outbound_group_session_length(\r
+ session->session);\r
+ void * pickleBuffer = malloc(pickleBufferLen);\r
+\r
+ olm_pickle_outbound_group_session(\r
+ session->session,\r
+ key, strlen(key),\r
+ pickleBuffer, pickleBufferLen);\r
+ \r
+ fwrite(&pickleBufferLen, sizeof(size_t), 1, f);\r
+ fwrite(pickleBuffer, 1, pickleBufferLen, f);\r
+ free(pickleBuffer);\r
+\r
+ fclose(f);\r
+\r
+ return true;\r
+}\r
+\r
+bool\r
+MatrixMegolmOutSessionLoad(\r
+ MatrixMegolmOutSession * session,\r
+ const char * filename,\r
+ const char * key)\r
+{\r
+ FILE * f = fopen(filename, "r");\r
+\r
+ size_t roomIdLen;\r
+ fread(&roomIdLen, sizeof(size_t), 1, f);\r
+ fread(session->roomId, 1, roomIdLen, f);\r
+\r
+ size_t pickleBufferLen;\r
+ fread(&pickleBufferLen, sizeof(size_t), 1, f);\r
+\r
+ void * pickleBuffer = malloc(pickleBufferLen);\r
+ fread(pickleBuffer, 1, pickleBufferLen, f);\r
+\r
+ olm_unpickle_outbound_group_session(\r
+ session->session,\r
+ key, strlen(key),\r
+ pickleBuffer, pickleBufferLen);\r
+ \r
+ free(pickleBuffer);\r
+\r
+ fclose(f);\r
+\r
+ return true;\r
+}\r
+\r
\r
\r
bool\r
MatrixClient * client,\r
const char * accessToken)\r
{\r
- int accessTokenLen = strlen(accessToken);\r
-\r
- if (accessTokenLen > ACCESS_TOKEN_SIZE - 1)\r
- return false;\r
-\r
- for (int i = 0; i < accessTokenLen; i++)\r
+ for (int i = 0; i < ACCESS_TOKEN_SIZE-1; i++)\r
client->accessToken[i] = accessToken[i];\r
- client->accessToken[accessTokenLen] = '\0';\r
+ client->accessToken[ACCESS_TOKEN_SIZE-1] = '\0';\r
\r
return true;\r
}\r
MatrixClient * client,\r
const char * deviceId)\r
{\r
- int deviceIdLen = strlen(deviceId);\r
-\r
- if (deviceIdLen > DEVICE_ID_SIZE - 1)\r
- return false;\r
-\r
- for (int i = 0; i < deviceIdLen; i++)\r
+ for (int i = 0; i < DEVICE_ID_SIZE-1; i++)\r
client->deviceId[i] = deviceId[i];\r
- client->deviceId[deviceIdLen] = '\0';\r
+ client->deviceId[DEVICE_ID_SIZE-1] = '\0';\r
\r
return true;\r
}\r
MatrixClient * client,\r
const char * userId)\r
{\r
- int userIdLen = strlen(userId);\r
-\r
- if (userIdLen > USER_ID_SIZE - 1)\r
- return false;\r
-\r
- for (int i = 0; i < userIdLen; i++)\r
+ for (int i = 0; i < USER_ID_SIZE-1; i++)\r
client->userId[i] = userId[i];\r
- client->userId[userIdLen] = '\0';\r
+ client->userId[USER_ID_SIZE-1] = '\0';\r
\r
return true;\r
}\r
MatrixMegolmOutSessionInit(\r
MatrixMegolmOutSession * session,\r
const char * roomId);\r
- \r
+\r
bool\r
MatrixMegolmOutSessionEncrypt(\r
MatrixMegolmOutSession * session,\r
const char * plaintext,\r
char * outBuffer, int outBufferCap);\r
\r
+bool\r
+MatrixMegolmOutSessionSave(\r
+ MatrixMegolmOutSession * session,\r
+ const char * filename,\r
+ const char * key);\r
+ \r
+bool\r
+MatrixMegolmOutSessionLoad(\r
+ MatrixMegolmOutSession * session,\r
+ const char * filename,\r
+ const char * key);\r
+\r
\r
// Matrix Client\r
\r