]> gitweb.ps.run Git - matrix_esp_thesis/commitdiff
cli send encrypted & manage megolm session, save/load megolm sessions
authorPatrick <patrick.schoenberger@posteo.de>
Thu, 20 Jul 2023 21:15:26 +0000 (23:15 +0200)
committerPatrick <patrick.schoenberger@posteo.de>
Thu, 20 Jul 2023 21:15:26 +0000 (23:15 +0200)
examples/Cli.c
src/matrix.c
src/matrix.h

index b2fbe451f967bab7c672e04a8f063a2da9b06cea..4a8e571c9df413bc74b39663511562f25f6c3545 100644 (file)
@@ -133,8 +133,6 @@ ExecuteCommand(
             "{\"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
@@ -148,6 +146,43 @@ ExecuteCommand(
     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
index 80802c3e36953003e476b0e3d633b748d3ec767f..fa7303f891e250dfc5d1349e6293ee8bf4d5a7ff 100644 (file)
@@ -226,6 +226,67 @@ MatrixMegolmOutSessionEncrypt(
     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
@@ -315,14 +376,9 @@ MatrixClientSetAccessToken(
     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
@@ -332,14 +388,9 @@ MatrixClientSetDeviceId(
     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
@@ -349,14 +400,9 @@ MatrixClientSetUserId(
     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
index 91ed208623a94804b5a398726a74c56dc8cc7e2e..073f61002d6c2486cd64d0580ef8199230d04d4b 100644 (file)
@@ -115,13 +115,25 @@ bool
 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