diff --git a/android/app/src/play/java/chat/rocket/reactnative/Ejson.java b/android/app/src/play/java/chat/rocket/reactnative/Ejson.java index c5ee7595cb..56d0b09489 100644 --- a/android/app/src/play/java/chat/rocket/reactnative/Ejson.java +++ b/android/app/src/play/java/chat/rocket/reactnative/Ejson.java @@ -36,6 +36,8 @@ public class Ejson { String tmid; + Content content; + private MMKV mmkv; private String TOKEN_KEY = "reactnativemeteor_usertoken-"; @@ -102,4 +104,9 @@ public class Sender { String username; String _id; } + + public class Content { + String ciphertext; + String algorithm; + } } diff --git a/android/app/src/play/java/chat/rocket/reactnative/Encryption.java b/android/app/src/play/java/chat/rocket/reactnative/Encryption.java index 7ddab1979c..2e6e4a79dd 100644 --- a/android/app/src/play/java/chat/rocket/reactnative/Encryption.java +++ b/android/app/src/play/java/chat/rocket/reactnative/Encryption.java @@ -9,12 +9,12 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.WritableMap; import com.google.gson.Gson; -import com.nozbe.watermelondb.Database; import com.pedrouid.crypto.RCTAes; import com.pedrouid.crypto.RCTRsaUtils; import com.pedrouid.crypto.RSA; import com.pedrouid.crypto.Util; +import java.io.File; import java.lang.reflect.Field; import java.security.SecureRandom; import java.util.Arrays; @@ -31,6 +31,14 @@ class Message { } } +class DecryptedContent { + String msg; + + DecryptedContent(String msg) { + this.msg = msg; + } +} + class PrivateKey { String d; String dp; @@ -58,44 +66,66 @@ class Room { class Encryption { private Gson gson = new Gson(); - private String E2ERoomKey; private String keyId; public static Encryption shared = new Encryption(); private ReactApplicationContext reactContext; - public Room readRoom(final Ejson ejson) throws NoSuchFieldException { + public Room readRoom(final Ejson ejson) { + String dbName = getDatabaseName(ejson.serverURL()); + SQLiteDatabase db = null; + + try { + db = SQLiteDatabase.openDatabase(dbName, null, SQLiteDatabase.OPEN_READONLY); + String[] queryArgs = {ejson.rid}; + + Cursor cursor = db.rawQuery("SELECT * FROM subscriptions WHERE id == ? LIMIT 1", queryArgs); + + if (cursor.getCount() == 0) { + cursor.close(); + return null; + } + + cursor.moveToFirst(); + String e2eKey = cursor.getString(cursor.getColumnIndex("e2e_key")); + Boolean encrypted = cursor.getInt(cursor.getColumnIndex("encrypted")) > 0; + cursor.close(); + + return new Room(e2eKey, encrypted); + + } catch (Exception e) { + Log.e("[ENCRYPTION]", "Error reading room", e); + return null; + + } finally { + if (db != null) { + db.close(); + } + } + } + + private String getDatabaseName(String serverUrl) { int resId = reactContext.getResources().getIdentifier("rn_config_reader_custom_package", "string", reactContext.getPackageName()); String className = reactContext.getString(resId); - Class clazz = null; Boolean isOfficial = false; + try { - clazz = Class.forName(className + ".BuildConfig"); + Class clazz = Class.forName(className + ".BuildConfig"); Field IS_OFFICIAL = clazz.getField("IS_OFFICIAL"); isOfficial = (Boolean) IS_OFFICIAL.get(null); - } catch (ClassNotFoundException | IllegalAccessException e) { + } catch (Exception e) { e.printStackTrace(); } - String dbName = ejson.serverURL().replace("https://", ""); + + String dbName = serverUrl.replace("https://", ""); if (!isOfficial) { dbName += "-experimental"; } - dbName += ".db"; - Database database = new Database(dbName, reactContext, SQLiteDatabase.CREATE_IF_NECESSARY); - String[] query = {ejson.rid}; - Cursor cursor = database.rawQuery("select * from subscriptions where id == ? limit 1", query); - - // Room not found - if (cursor.getCount() == 0) { - return null; - } - - cursor.moveToFirst(); - String e2eKey = cursor.getString(cursor.getColumnIndex("e2e_key")); - Boolean encrypted = cursor.getInt(cursor.getColumnIndex("encrypted")) > 0; - cursor.close(); - - return new Room(e2eKey, encrypted); + // Old issue. Safer to accept it then to migrate away from it. + dbName += ".db.db"; + // https://github.com/Nozbe/WatermelonDB/blob/a757e646141437ad9a06f7314ad5555a8a4d252e/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java#L18 + File databasePath = new File(reactContext.getDatabasePath(dbName).getPath().replace("/databases", "")); + return databasePath.getPath(); } public String readUserKey(final Ejson ejson) throws Exception { @@ -120,7 +150,7 @@ public String readUserKey(final Ejson ejson) throws Exception { } public String decryptRoomKey(final String e2eKey, final Ejson ejson) throws Exception { - String key = e2eKey.substring(12, e2eKey.length()); + String key = e2eKey.substring(12); keyId = e2eKey.substring(0, 12); String userKey = readUserKey(ejson); @@ -138,6 +168,15 @@ public String decryptRoomKey(final String e2eKey, final Ejson ejson) throws Exce return Util.bytesToHex(decoded); } + private String decryptText(String text, String e2eKey) throws Exception { + String msg = text.substring(12); + byte[] msgData = Base64.decode(msg, Base64.NO_WRAP); + String b64 = Base64.encodeToString(Arrays.copyOfRange(msgData, 16, msgData.length), Base64.DEFAULT); + String decrypted = RCTAes.decrypt(b64, e2eKey, Util.bytesToHex(Arrays.copyOfRange(msgData, 0, 16))); + byte[] data = Base64.decode(decrypted, Base64.NO_WRAP); + return new String(data, "UTF-8"); + } + public String decryptMessage(final Ejson ejson, final ReactApplicationContext reactContext) { try { this.reactContext = reactContext; @@ -151,19 +190,22 @@ public String decryptMessage(final Ejson ejson, final ReactApplicationContext re return null; } - String message = ejson.msg; - String msg = message.substring(12, message.length()); - byte[] msgData = Base64.decode(msg, Base64.NO_WRAP); - - String b64 = Base64.encodeToString(Arrays.copyOfRange(msgData, 16, msgData.length), Base64.DEFAULT); - - String decrypted = RCTAes.decrypt(b64, e2eKey, Util.bytesToHex(Arrays.copyOfRange(msgData, 0, 16))); - byte[] data = Base64.decode(decrypted, Base64.NO_WRAP); - Message m = gson.fromJson(new String(data, "UTF-8"), Message.class); + if (ejson.msg != null && !ejson.msg.isEmpty()) { + String message = ejson.msg; + String decryptedText = decryptText(message, e2eKey); + Message m = gson.fromJson(decryptedText, Message.class); + return m.text; + } else if (ejson.content != null && "rc.v1.aes-sha2".equals(ejson.content.algorithm)) { + String message = ejson.content.ciphertext; + String decryptedText = decryptText(message, e2eKey); + DecryptedContent m = gson.fromJson(decryptedText, DecryptedContent.class); + return m.msg; + } else { + return null; + } - return m.text; } catch (Exception e) { - Log.d("[ROCKETCHAT][E2E]", Log.getStackTraceString(e)); + Log.e("[ROCKETCHAT][E2E]", Log.getStackTraceString(e)); } return null; @@ -193,29 +235,26 @@ public String encryptMessage(final String message, final String id, final Ejson return keyId + Base64.encodeToString(concat(bytes, data), Base64.NO_WRAP); } catch (Exception e) { - Log.d("[ROCKETCHAT][E2E]", Log.getStackTraceString(e)); + Log.e("[ROCKETCHAT][E2E]", Log.getStackTraceString(e)); } return message; } static byte[] concat(byte[]... arrays) { - // Determine the length of the result array int totalLength = 0; - for (int i = 0; i < arrays.length; i++) { - totalLength += arrays[i].length; + for (byte[] array : arrays) { + totalLength += array.length; } - // create the result array byte[] result = new byte[totalLength]; - - // copy the source arrays into the result array int currentIndex = 0; - for (int i = 0; i < arrays.length; i++) { - System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length); - currentIndex += arrays[i].length; + + for (byte[] array : arrays) { + System.arraycopy(array, 0, result, currentIndex, array.length); + currentIndex += array.length; } return result; } -} +} \ No newline at end of file diff --git a/app/sagas/createChannel.js b/app/sagas/createChannel.js index fe81c717d2..acc2618812 100644 --- a/app/sagas/createChannel.js +++ b/app/sagas/createChannel.js @@ -60,7 +60,7 @@ const handleRequest = function* handleRequest({ data }) { try { const db = database.active; const subCollection = db.get('subscriptions'); - yield db.action(async () => { + yield db.write(async () => { await subCollection.create(s => { s._raw = sanitizedRaw({ id: sub.rid }, subCollection.schema); Object.assign(s, sub); diff --git a/app/sagas/createDiscussion.js b/app/sagas/createDiscussion.js index f569833f5b..9808819d02 100644 --- a/app/sagas/createDiscussion.js +++ b/app/sagas/createDiscussion.js @@ -22,7 +22,7 @@ const handleRequest = function* handleRequest({ data }) { try { const db = database.active; const subCollection = db.get('subscriptions'); - yield db.action(async () => { + yield db.write(async () => { await subCollection.create(s => { s._raw = sanitizedRaw({ id: sub.rid }, subCollection.schema); Object.assign(s, sub); diff --git a/app/sagas/login.js b/app/sagas/login.js index fb2fcabc69..d155c6778c 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -101,7 +101,7 @@ const handleLoginRequest = function* handleLoginRequest({ // Saves username on server history const serversDB = database.servers; const serversHistoryCollection = serversDB.get('servers_history'); - yield serversDB.action(async () => { + yield serversDB.write(async () => { try { const serversHistory = await serversHistoryCollection.query(Q.where('url', server)).fetch(); if (serversHistory?.length) { @@ -216,7 +216,7 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) { nickname: user.nickname, requirePasswordChange: user.requirePasswordChange }; - yield serversDB.action(async () => { + yield serversDB.write(async () => { try { const userRecord = await usersCollection.find(user.id); await userRecord.update(record => { diff --git a/app/sagas/rooms.js b/app/sagas/rooms.js index 66e601e48e..e93181c021 100644 --- a/app/sagas/rooms.js +++ b/app/sagas/rooms.js @@ -16,7 +16,7 @@ const updateRooms = function* updateRooms({ server, newRoomsUpdatedAt }) { try { const serverRecord = yield serversCollection.find(server); - return serversDB.action(async () => { + return serversDB.write(async () => { await serverRecord.update(record => { record.roomsUpdatedAt = newRoomsUpdatedAt; }); @@ -123,7 +123,7 @@ const handleRoomsRequest = function* handleRoomsRequest({ params }) { }) ]; - yield db.action(async () => { + yield db.write(async () => { await db.batch(...allRecords); }); } diff --git a/ios/NotificationService/NotificationService-Bridging-Header.h b/ios/NotificationService/NotificationService-Bridging-Header.h index cb9650a24f..5944a335b4 100644 --- a/ios/NotificationService/NotificationService-Bridging-Header.h +++ b/ios/NotificationService/NotificationService-Bridging-Header.h @@ -10,7 +10,4 @@ #import #import #import -#import - -// Silence warning -#import "../../node_modules/@nozbe/watermelondb/native/ios/WatermelonDB/SupportingFiles/Bridging.h" \ No newline at end of file +#import \ No newline at end of file diff --git a/ios/NotificationService/NotificationService.swift b/ios/NotificationService/NotificationService.swift index 6ca52c5c4e..54b0c6ac4a 100644 --- a/ios/NotificationService/NotificationService.swift +++ b/ios/NotificationService/NotificationService.swift @@ -49,11 +49,23 @@ class NotificationService: UNNotificationServiceExtension { func processPayload(payload: Payload) { // If is a encrypted message if payload.messageType == .e2e { - if let message = payload.msg, let rid = payload.rid { - if let decryptedMessage = rocketchat?.decryptMessage(rid: rid, message: message) { - bestAttemptContent?.body = decryptedMessage - if let roomType = payload.type, roomType == .group, let sender = payload.senderName { - bestAttemptContent?.body = "\(sender): \(decryptedMessage)" + if let rid = payload.rid { + let messageToDecrypt: String? + + if let msg = payload.msg, !msg.isEmpty { + messageToDecrypt = msg + } else if let content = payload.content, content.algorithm == "rc.v1.aes-sha2" { + messageToDecrypt = content.ciphertext + } else { + messageToDecrypt = nil + } + + if let messageToDecrypt = messageToDecrypt, !messageToDecrypt.isEmpty { + if let decryptedMessage = rocketchat?.decryptMessage(rid: rid, message: messageToDecrypt) { + bestAttemptContent?.body = decryptedMessage + if let roomType = payload.type, roomType == .group, let sender = payload.senderName { + bestAttemptContent?.body = "\(sender): \(decryptedMessage)" + } } } } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3b71517052..64b622c73b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1306,12 +1306,12 @@ PODS: - SDWebImageWebPCoder (0.13.0): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - simdjson (1.0.0) + - simdjson (3.1.0-wmelon1) - SocketRocket (0.6.1) - TOCropViewController (2.6.1) - - WatermelonDB (0.25.5): + - WatermelonDB (0.27.1): - React - - React-jsi + - simdjson - Yoga (1.14.0) - ZXingObjC/Core (3.6.9) - ZXingObjC/OneD (3.6.9): @@ -1773,10 +1773,10 @@ SPEC CHECKSUMS: RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9 SDWebImageWebPCoder: af09429398d99d524cae2fe00f6f0f6e491ed102 - simdjson: c96317b3a50dff3468a42f586ab7ed22c6ab2fd9 + simdjson: e6bfae9ce4bcdc80452d388d593816f1ca2106f3 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 - WatermelonDB: 6ae836b52d11281d87187ff2283480e44b111771 + WatermelonDB: 842d22ba555425aa9f3ce551239a001200c539bc Yoga: d17d2cc8105eed528474683b42e2ea310e1daf61 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index 009f6c0939..a46c257bf1 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 0C6E2DE448364EA896869ADF /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B37C79D9BD0742CE936B6982 /* libc++.tbd */; }; - 11458A5C2AA3258415FD44CA /* libPods-defaults-RocketChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CECEE63A3CB6B8D3AB664544 /* libPods-defaults-RocketChatRN.a */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 1E01C81C2511208400FEF824 /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E01C81B2511208400FEF824 /* URL+Extensions.swift */; }; @@ -172,9 +171,6 @@ 1ED038A92B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; 1ED038AA2B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; 1ED038AB2B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; - 1ED038AD2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; - 1ED038AE2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; - 1ED038AF2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; 1ED038BA2B50A1B800C007D4 /* WatchConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */; }; 1ED038BB2B50A1B800C007D4 /* WatchConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */; }; 1ED038BE2B50A1D400C007D4 /* DBServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038BD2B50A1D400C007D4 /* DBServer.swift */; }; @@ -345,14 +341,21 @@ 7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */; }; 7AAB3E49257E6A6E00707CF6 /* ShareRocketChatRN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 7AAB3E4A257E6A6E00707CF6 /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EFEB5952493B6640072EDC0 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 7AACF8A82C94AB8B0082844E /* EncryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8A72C94AB8B0082844E /* EncryptedContent.swift */; }; + 7AACF8A92C94AB8B0082844E /* EncryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8A72C94AB8B0082844E /* EncryptedContent.swift */; }; + 7AACF8AA2C94AB8B0082844E /* EncryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8A72C94AB8B0082844E /* EncryptedContent.swift */; }; + 7AACF8AC2C94B28B0082844E /* DecryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8AB2C94B28B0082844E /* DecryptedContent.swift */; }; + 7AACF8AD2C94B28B0082844E /* DecryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8AB2C94B28B0082844E /* DecryptedContent.swift */; }; + 7AACF8AE2C94B28B0082844E /* DecryptedContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AACF8AB2C94B28B0082844E /* DecryptedContent.swift */; }; 7ACD4897222860DE00442C55 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */; }; 7AE10C0628A59530003593CB /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7AE10C0528A59530003593CB /* Inter.ttf */; }; 7AE10C0828A59530003593CB /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7AE10C0528A59530003593CB /* Inter.ttf */; }; 85160EB6C143E0493FE5F014 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194D9A8897F4A486C2C6F89A /* ExpoModulesProvider.swift */; }; + 892FF3366E238E823D4CA98E /* libPods-defaults-NotificationService.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 69313923BC265219F5AA0F91 /* libPods-defaults-NotificationService.a */; }; BC404914E86821389EEB543D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 391C4F7AA7023CD41EEBD106 /* ExpoModulesProvider.swift */; }; + DBEC1C2EEA49CE58FC49459C /* libPods-defaults-RocketChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DC2CC64CE5D2A2783D74136 /* libPods-defaults-RocketChatRN.a */; }; DD2BA30A89E64F189C2C24AC /* libWatermelonDB.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BA7E862283664608B3894E34 /* libWatermelonDB.a */; }; - E1128307ED6B633DCFA719A7 /* libPods-defaults-NotificationService.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 13F4DC5088372D03708D88AB /* libPods-defaults-NotificationService.a */; }; - EF13130FD8CC298C22E55BC2 /* libPods-defaults-Rocket.Chat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A0D76263ED0B75215C144160 /* libPods-defaults-Rocket.Chat.a */; }; + E9D6F82BDFEFD27188D7891D /* libPods-defaults-Rocket.Chat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C23DBD55D58FB3F83AACFDB9 /* libPods-defaults-Rocket.Chat.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -452,13 +455,14 @@ /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 06BB44DD4855498082A744AD /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 0AEAF0543E5B9616162C8362 /* Pods-defaults-Rocket.Chat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.release.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.release.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Rocket.Chat Experimental.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Rocket.Chat Experimental.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RocketChatRN/AppDelegate.h; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RocketChatRN/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RocketChatRN/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RocketChatRN/main.m; sourceTree = ""; }; - 13F4DC5088372D03708D88AB /* libPods-defaults-NotificationService.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-NotificationService.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 194D9A8897F4A486C2C6F89A /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-defaults-NotificationService/ExpoModulesProvider.swift"; sourceTree = ""; }; + 1C0FFCE99E2473945DBC888B /* Pods-defaults-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.debug.xcconfig"; sourceTree = ""; }; 1E01C81B2511208400FEF824 /* URL+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Extensions.swift"; sourceTree = ""; }; 1E01C8202511301400FEF824 /* PushResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushResponse.swift; sourceTree = ""; }; 1E01C8242511303100FEF824 /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; @@ -580,7 +584,6 @@ 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+Extensions.swift"; sourceTree = ""; }; 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Extensions.swift"; sourceTree = ""; }; 1ED038A82B5090AD00C007D4 /* MMKV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MMKV.swift; sourceTree = ""; }; - 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatermelonDB+Extensions.swift"; sourceTree = ""; }; 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchConnection.swift; sourceTree = ""; }; 1ED038BD2B50A1D400C007D4 /* DBServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DBServer.swift; sourceTree = ""; }; 1ED038C02B50A1E400C007D4 /* DBUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DBUser.swift; sourceTree = ""; }; @@ -603,12 +606,15 @@ 1EFEB5992493B6640072EDC0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1EFEB5A12493B67D0072EDC0 /* NotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationService.entitlements; sourceTree = ""; }; 391C4F7AA7023CD41EEBD106 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-defaults-Rocket.Chat/ExpoModulesProvider.swift"; sourceTree = ""; }; - 39E7C5047F3B1754D345A5EF /* Pods-defaults-RocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.debug.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.debug.xcconfig"; sourceTree = ""; }; + 3CDB00F98CBC54FF46A9FCF0 /* Pods-defaults-Rocket.Chat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.debug.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.debug.xcconfig"; sourceTree = ""; }; 45D5C142B655F8EFD006792C /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-defaults-RocketChatRN/ExpoModulesProvider.swift"; sourceTree = ""; }; + 5C0B495947CE6B8AC39A2B20 /* Pods-defaults-RocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.debug.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.debug.xcconfig"; sourceTree = ""; }; + 5DC2CC64CE5D2A2783D74136 /* libPods-defaults-RocketChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-RocketChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 60B2A6A31FC4588700BD58E5 /* RocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RocketChatRN.entitlements; path = RocketChatRN/RocketChatRN.entitlements; sourceTree = ""; }; - 61327C39E221B850D55A0B50 /* Pods-defaults-RocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.release.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.release.xcconfig"; sourceTree = ""; }; 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 65B9A7192AFC24190088956F /* ringtone.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ringtone.mp3; sourceTree = ""; }; + 69313923BC265219F5AA0F91 /* libPods-defaults-NotificationService.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-NotificationService.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C3267AF369919974DD51522 /* Pods-defaults-RocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.release.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.release.xcconfig"; sourceTree = ""; }; 7A006F13229C83B600803143 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 7A0129D22C6E8B5900F84A97 /* ShareRocketChatRN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareRocketChatRN.swift; sourceTree = ""; }; 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; @@ -620,16 +626,14 @@ 7A92554528777E0100EC3DA3 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = RocketChatRN/AppDelegate.mm; sourceTree = ""; }; 7AAA749C23043B1D00F1ADE9 /* RocketChatRN-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RocketChatRN-Bridging-Header.h"; sourceTree = ""; }; 7AAB3E52257E6A6E00707CF6 /* Rocket.Chat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rocket.Chat.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AACF8A72C94AB8B0082844E /* EncryptedContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptedContent.swift; sourceTree = ""; }; + 7AACF8AB2C94B28B0082844E /* DecryptedContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecryptedContent.swift; sourceTree = ""; }; 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 7AE10C0528A59530003593CB /* Inter.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Inter.ttf; sourceTree = ""; }; - 9C118E16A92C887C0DE56F72 /* Pods-defaults-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.debug.xcconfig"; sourceTree = ""; }; - A0D76263ED0B75215C144160 /* libPods-defaults-Rocket.Chat.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-Rocket.Chat.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7DCBC60D1813EE90B70756E9 /* Pods-defaults-NotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.release.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.release.xcconfig"; sourceTree = ""; }; B37C79D9BD0742CE936B6982 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; - B40998752613948693A7FC34 /* Pods-defaults-Rocket.Chat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.release.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.release.xcconfig"; sourceTree = ""; }; BA7E862283664608B3894E34 /* libWatermelonDB.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libWatermelonDB.a; sourceTree = ""; }; - BC52370BEF49AC7F705038EF /* Pods-defaults-NotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.release.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.release.xcconfig"; sourceTree = ""; }; - C932D116569A690F350F3C13 /* Pods-defaults-Rocket.Chat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.debug.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.debug.xcconfig"; sourceTree = ""; }; - CECEE63A3CB6B8D3AB664544 /* libPods-defaults-RocketChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-RocketChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C23DBD55D58FB3F83AACFDB9 /* libPods-defaults-Rocket.Chat.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-Rocket.Chat.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -650,7 +654,7 @@ 7ACD4897222860DE00442C55 /* JavaScriptCore.framework in Frameworks */, 24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */, DD2BA30A89E64F189C2C24AC /* libWatermelonDB.a in Frameworks */, - 11458A5C2AA3258415FD44CA /* libPods-defaults-RocketChatRN.a in Frameworks */, + DBEC1C2EEA49CE58FC49459C /* libPods-defaults-RocketChatRN.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -672,7 +676,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E1128307ED6B633DCFA719A7 /* libPods-defaults-NotificationService.a in Frameworks */, + 892FF3366E238E823D4CA98E /* libPods-defaults-NotificationService.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -693,7 +697,7 @@ 7AAB3E3D257E6A6E00707CF6 /* JavaScriptCore.framework in Frameworks */, 7AAB3E3E257E6A6E00707CF6 /* libz.tbd in Frameworks */, 7AAB3E3F257E6A6E00707CF6 /* libWatermelonDB.a in Frameworks */, - EF13130FD8CC298C22E55BC2 /* libPods-defaults-Rocket.Chat.a in Frameworks */, + E9D6F82BDFEFD27188D7891D /* libPods-defaults-Rocket.Chat.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -921,7 +925,6 @@ 1E67380324DC529B0009E081 /* String+Extensions.swift */, 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */, 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */, - 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -932,6 +935,8 @@ 1E01C8202511301400FEF824 /* PushResponse.swift */, 1E01C8242511303100FEF824 /* Notification.swift */, 1E01C8262511303900FEF824 /* Payload.swift */, + 7AACF8A72C94AB8B0082844E /* EncryptedContent.swift */, + 7AACF8AB2C94B28B0082844E /* DecryptedContent.swift */, 1E01C8282511304100FEF824 /* Sender.swift */, 1E01C82A2511335A00FEF824 /* Message.swift */, 1E01C82C2511337700FEF824 /* RoomKey.swift */, @@ -1116,12 +1121,12 @@ 7AC2B09613AA7C3FEBAC9F57 /* Pods */ = { isa = PBXGroup; children = ( - 9C118E16A92C887C0DE56F72 /* Pods-defaults-NotificationService.debug.xcconfig */, - BC52370BEF49AC7F705038EF /* Pods-defaults-NotificationService.release.xcconfig */, - C932D116569A690F350F3C13 /* Pods-defaults-Rocket.Chat.debug.xcconfig */, - B40998752613948693A7FC34 /* Pods-defaults-Rocket.Chat.release.xcconfig */, - 39E7C5047F3B1754D345A5EF /* Pods-defaults-RocketChatRN.debug.xcconfig */, - 61327C39E221B850D55A0B50 /* Pods-defaults-RocketChatRN.release.xcconfig */, + 1C0FFCE99E2473945DBC888B /* Pods-defaults-NotificationService.debug.xcconfig */, + 7DCBC60D1813EE90B70756E9 /* Pods-defaults-NotificationService.release.xcconfig */, + 3CDB00F98CBC54FF46A9FCF0 /* Pods-defaults-Rocket.Chat.debug.xcconfig */, + 0AEAF0543E5B9616162C8362 /* Pods-defaults-Rocket.Chat.release.xcconfig */, + 5C0B495947CE6B8AC39A2B20 /* Pods-defaults-RocketChatRN.debug.xcconfig */, + 6C3267AF369919974DD51522 /* Pods-defaults-RocketChatRN.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -1217,9 +1222,9 @@ 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */, B37C79D9BD0742CE936B6982 /* libc++.tbd */, 06BB44DD4855498082A744AD /* libz.tbd */, - 13F4DC5088372D03708D88AB /* libPods-defaults-NotificationService.a */, - A0D76263ED0B75215C144160 /* libPods-defaults-Rocket.Chat.a */, - CECEE63A3CB6B8D3AB664544 /* libPods-defaults-RocketChatRN.a */, + 69313923BC265219F5AA0F91 /* libPods-defaults-NotificationService.a */, + C23DBD55D58FB3F83AACFDB9 /* libPods-defaults-Rocket.Chat.a */, + 5DC2CC64CE5D2A2783D74136 /* libPods-defaults-RocketChatRN.a */, ); name = Frameworks; sourceTree = ""; @@ -1239,7 +1244,7 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RocketChatRN" */; buildPhases = ( - 28C6252E50C6D81291B0621E /* [CP] Check Pods Manifest.lock */, + 7730298F9B157D2F197EF19E /* [CP] Check Pods Manifest.lock */, 7AA5C63E23E30D110005C4A7 /* Start Packager */, 589729E8381BA997CD19EF19 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, @@ -1252,8 +1257,8 @@ 7AAE9EB32891A0D20024F559 /* Upload source maps to Bugsnag */, 407D3EDE3DABEE15D27BD87D /* ShellScript */, 9C104B12BEE385F7555E641F /* [Expo] Configure project */, - CC37BA3991B9772464B8ED9C /* [CP] Embed Pods Frameworks */, - A612554BBF43398AE541FBA4 /* [CP] Copy Pods Resources */, + 4A38FD9DFF48FCF3ABA54C3A /* [CP] Embed Pods Frameworks */, + 2D3137420B17B8705D0F8452 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1321,12 +1326,12 @@ isa = PBXNativeTarget; buildConfigurationList = 1EFEB5A02493B6640072EDC0 /* Build configuration list for PBXNativeTarget "NotificationService" */; buildPhases = ( - 5131D72D372D40183A2ED0C0 /* [CP] Check Pods Manifest.lock */, + 141C4AA3AE3C8BE3A165C9AA /* [CP] Check Pods Manifest.lock */, 86A998705576AFA7CE938617 /* [Expo] Configure project */, 1EFEB5912493B6640072EDC0 /* Sources */, 1EFEB5922493B6640072EDC0 /* Frameworks */, 1EFEB5932493B6640072EDC0 /* Resources */, - 959EC9F72A0BB7F1378F425D /* [CP] Copy Pods Resources */, + 1929E6B57AF5E6DF47A2FDD3 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1341,7 +1346,7 @@ isa = PBXNativeTarget; buildConfigurationList = 7AAB3E4F257E6A6E00707CF6 /* Build configuration list for PBXNativeTarget "Rocket.Chat" */; buildPhases = ( - 82BCD301AF1E0A999C9E4C05 /* [CP] Check Pods Manifest.lock */, + 7B9AFE18F3558B9AE6E189BE /* [CP] Check Pods Manifest.lock */, 7AAB3E13257E6A6E00707CF6 /* Start Packager */, 6723DBD924B66933E14E7EF7 /* [Expo] Configure project */, 7AAB3E14257E6A6E00707CF6 /* Sources */, @@ -1352,8 +1357,8 @@ 7AAB3E4B257E6A6E00707CF6 /* ShellScript */, 1ED1ECE32B8699DD00F6620C /* Embed Watch Content */, 7A10288726B1D15200E47EF8 /* Upload source maps to Bugsnag */, - 68D30C2C25C47050EF8445D4 /* [CP] Embed Pods Frameworks */, - C5C08553712F34D14FA1C3FE /* [CP] Copy Pods Resources */, + 444A25155156529E8C9D0A10 /* [CP] Embed Pods Frameworks */, + C6A09625AB6E9326D4923932 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1543,7 +1548,7 @@ shellPath = /bin/sh; shellScript = ". ~/.nvm/nvm.sh\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\"\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; - 1E1EA8082326CCE300E22452 /* ShellScript */ = { + 141C4AA3AE3C8BE3A165C9AA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1551,16 +1556,97 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-defaults-NotificationService-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"Target architectures: $ARCHS\"\n\nAPP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\necho $(lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\")\n\nFRAMEWORK_TMP_PATH=\"$FRAMEWORK_EXECUTABLE_PATH-tmp\"\n\n# remove simulator's archs if location is not simulator's directory\ncase \"${TARGET_BUILD_DIR}\" in\n*\"iphonesimulator\")\necho \"No need to remove archs\"\n;;\n*)\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"i386\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"i386\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"i386 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"x86_64\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"x86_64\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"x86_64 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\n;;\nesac\n\necho \"Completed for executable $FRAMEWORK_EXECUTABLE_PATH\"\necho $\n\ndone\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 1929E6B57AF5E6DF47A2FDD3 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService-resources.sh\"\n"; + showEnvVarsInLog = 0; }; - 28C6252E50C6D81291B0621E /* [CP] Check Pods Manifest.lock */ = { + 1E1EA8082326CCE300E22452 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1568,18 +1654,89 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-defaults-RocketChatRN-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "echo \"Target architectures: $ARCHS\"\n\nAPP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\necho $(lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\")\n\nFRAMEWORK_TMP_PATH=\"$FRAMEWORK_EXECUTABLE_PATH-tmp\"\n\n# remove simulator's archs if location is not simulator's directory\ncase \"${TARGET_BUILD_DIR}\" in\n*\"iphonesimulator\")\necho \"No need to remove archs\"\n;;\n*)\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"i386\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"i386\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"i386 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"x86_64\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"x86_64\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"x86_64 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\n;;\nesac\n\necho \"Completed for executable $FRAMEWORK_EXECUTABLE_PATH\"\necho $\n\ndone\n"; + }; + 2D3137420B17B8705D0F8452 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh\"\n"; showEnvVarsInLog = 0; }; 407D3EDE3DABEE15D27BD87D /* ShellScript */ = { @@ -1600,26 +1757,44 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5131D72D372D40183A2ED0C0 /* [CP] Check Pods Manifest.lock */ = { + 444A25155156529E8C9D0A10 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", + "${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 4A38FD9DFF48FCF3ABA54C3A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); + name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-defaults-NotificationService-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 589729E8381BA997CD19EF19 /* [Expo] Configure project */ = { @@ -1660,24 +1835,26 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-Rocket.Chat/expo-configure-project.sh\"\n"; }; - 68D30C2C25C47050EF8445D4 /* [CP] Embed Pods Frameworks */ = { + 7730298F9B157D2F197EF19E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + "$(DERIVED_FILE_DIR)/Pods-defaults-RocketChatRN-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 7A10288726B1D15200E47EF8 /* Upload source maps to Bugsnag */ = { @@ -1785,7 +1962,7 @@ shellPath = /bin/sh; shellScript = "SOURCE_MAP=\"$TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\" ../node_modules/@bugsnag/react-native/bugsnag-react-native-xcode.sh\n"; }; - 82BCD301AF1E0A999C9E4C05 /* [CP] Check Pods Manifest.lock */ = { + 7B9AFE18F3558B9AE6E189BE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1826,82 +2003,6 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-NotificationService/expo-configure-project.sh\"\n"; }; - 959EC9F72A0BB7F1378F425D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9C104B12BEE385F7555E641F /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -1921,83 +2022,7 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-NotificationService/expo-configure-project.sh\"\n"; }; - A612554BBF43398AE541FBA4 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", - "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - C5C08553712F34D14FA1C3FE /* [CP] Copy Pods Resources */ = { + C6A09625AB6E9326D4923932 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2073,26 +2098,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-resources.sh\"\n"; showEnvVarsInLog = 0; }; - CC37BA3991B9772464B8ED9C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2120,10 +2125,11 @@ 1E76CBD125152C710067298C /* Date+Extensions.swift in Sources */, 1E76CBD425152C790067298C /* Database.swift in Sources */, 1E9A71742B59F36E00477BA2 /* ClientSSL.swift in Sources */, - 1ED038AD2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, + 7AACF8AC2C94B28B0082844E /* DecryptedContent.swift in Sources */, 1ED038A52B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 1E76CBC325152A460067298C /* String+Extensions.swift in Sources */, 1ED038BA2B50A1B800C007D4 /* WatchConnection.swift in Sources */, + 7AACF8A82C94AB8B0082844E /* EncryptedContent.swift in Sources */, 1ED038A12B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, 1E76CBCA25152C220067298C /* Notification.swift in Sources */, 1ED038C12B50A1E400C007D4 /* DBUser.swift in Sources */, @@ -2332,10 +2338,12 @@ files = ( 1E51D965251263D600DC95DE /* NotificationType.swift in Sources */, 1EF5FBD1250C109E00614FEA /* Encryption.swift in Sources */, + 7AACF8AD2C94B28B0082844E /* DecryptedContent.swift in Sources */, 1E598AE42515057D002BDFBD /* Date+Extensions.swift in Sources */, 1ED038A22B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, 1ED038AA2B5090AD00C007D4 /* MMKV.swift in Sources */, 1E01C81C2511208400FEF824 /* URL+Extensions.swift in Sources */, + 7AACF8A92C94AB8B0082844E /* EncryptedContent.swift in Sources */, 1E470E832513A71E00E3DD1D /* RocketChat.swift in Sources */, 1E2F615D25128FA300871711 /* Response.swift in Sources */, 1E01C82D2511337700FEF824 /* RoomKey.swift in Sources */, @@ -2343,7 +2351,6 @@ 1E0426E7251A54B4008F022C /* RoomType.swift in Sources */, 1E1C2F80250FCB69005DCE7D /* Database.swift in Sources */, 1E67380424DC529B0009E081 /* String+Extensions.swift in Sources */, - 1ED038AE2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, 1ED038A62B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 1E01C8292511304100FEF824 /* Sender.swift in Sources */, 1E51D962251263CD00DC95DE /* MessageType.swift in Sources */, @@ -2386,10 +2393,11 @@ 7AAB3E24257E6A6E00707CF6 /* Date+Extensions.swift in Sources */, 7AAB3E25257E6A6E00707CF6 /* Database.swift in Sources */, 1E9A71752B59F36E00477BA2 /* ClientSSL.swift in Sources */, - 1ED038AF2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, + 7AACF8AE2C94B28B0082844E /* DecryptedContent.swift in Sources */, 1ED038A72B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 7AAB3E26257E6A6E00707CF6 /* String+Extensions.swift in Sources */, 1ED038BB2B50A1B800C007D4 /* WatchConnection.swift in Sources */, + 7AACF8AA2C94AB8B0082844E /* EncryptedContent.swift in Sources */, 1ED038A32B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, 7AAB3E27257E6A6E00707CF6 /* Notification.swift in Sources */, 1ED038C22B50A1E400C007D4 /* DBUser.swift in Sources */, @@ -2468,7 +2476,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 39E7C5047F3B1754D345A5EF /* Pods-defaults-RocketChatRN.debug.xcconfig */; + baseConfigurationReference = 5C0B495947CE6B8AC39A2B20 /* Pods-defaults-RocketChatRN.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2529,7 +2537,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 61327C39E221B850D55A0B50 /* Pods-defaults-RocketChatRN.release.xcconfig */; + baseConfigurationReference = 6C3267AF369919974DD51522 /* Pods-defaults-RocketChatRN.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2950,7 +2958,7 @@ }; 1EFEB59D2493B6640072EDC0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9C118E16A92C887C0DE56F72 /* Pods-defaults-NotificationService.debug.xcconfig */; + baseConfigurationReference = 1C0FFCE99E2473945DBC888B /* Pods-defaults-NotificationService.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(EMBEDDED_CONTENT_CONTAINS_SWIFT)"; CLANG_ANALYZER_NONNULL = YES; @@ -2992,7 +3000,7 @@ }; 1EFEB59E2493B6640072EDC0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BC52370BEF49AC7F705038EF /* Pods-defaults-NotificationService.release.xcconfig */; + baseConfigurationReference = 7DCBC60D1813EE90B70756E9 /* Pods-defaults-NotificationService.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(EMBEDDED_CONTENT_CONTAINS_SWIFT)"; CLANG_ANALYZER_NONNULL = YES; @@ -3035,7 +3043,7 @@ }; 7AAB3E50257E6A6E00707CF6 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C932D116569A690F350F3C13 /* Pods-defaults-Rocket.Chat.debug.xcconfig */; + baseConfigurationReference = 3CDB00F98CBC54FF46A9FCF0 /* Pods-defaults-Rocket.Chat.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -3095,7 +3103,7 @@ }; 7AAB3E51257E6A6E00707CF6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B40998752613948693A7FC34 /* Pods-defaults-Rocket.Chat.release.xcconfig */; + baseConfigurationReference = 0AEAF0543E5B9616162C8362 /* Pods-defaults-Rocket.Chat.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; diff --git a/ios/SSLPinning/SSLPinning.swift b/ios/SSLPinning/SSLPinning.swift index c14a26fb32..021d7e1117 100644 --- a/ios/SSLPinning/SSLPinning.swift +++ b/ios/SSLPinning/SSLPinning.swift @@ -1,5 +1,3 @@ -import WatermelonDB - @objc(SSLPinning) final class SSLPinning: NSObject { private struct Constants { @@ -7,7 +5,7 @@ final class SSLPinning: NSObject { static let passwordKey = "ssl_pinning_password" } - private let database = WatermelonDB.Database(name: "default") + private let database = Database(name: "default") private let mmkv = MMKV.build() @objc func setCertificate(_ server: String, _ path: String, _ password: String) { @@ -23,21 +21,26 @@ final class SSLPinning: NSObject { mmkv.set(password, forKey: Constants.passwordKey.appending(server)) } - @objc func migrate() { - let serversQuery = database.query(raw: "select * from servers") as [DBServer] - - serversQuery.forEach { server in - guard let clientSSL = mmkv.clientSSL(for: server.url) else { - return - } - - setCertificate( - server.url.absoluteString.removeTrailingSlash(), - clientSSL.path, - clientSSL.password - ) - } - } + @objc func migrate() { + guard let serversQuery = database.query("SELECT * FROM servers") else { + print("No servers found") + return + } + + serversQuery.forEach { server in + guard let serverUrlString = server["url"] as? String, + let serverUrl = URL(string: serverUrlString), + let clientSSL = mmkv.clientSSL(for: serverUrl) else { + return + } + + setCertificate( + serverUrl.absoluteString.removeTrailingSlash(), + clientSSL.path, + clientSSL.password + ) + } + } func getCertificate(server: String) -> (certificate: Data, password: String)? { guard let certificate = mmkv.data(forKey: Constants.certificateKey.appending(server)) else { diff --git a/ios/Shared/Extensions/WatermelonDB+Extensions.swift b/ios/Shared/Extensions/WatermelonDB+Extensions.swift deleted file mode 100644 index 846b8991bb..0000000000 --- a/ios/Shared/Extensions/WatermelonDB+Extensions.swift +++ /dev/null @@ -1,33 +0,0 @@ -import WatermelonDB - -extension WatermelonDB.Database { - convenience init(name: String) { - let isOfficial = Bundle.main.bool(forKey: "IS_OFFICIAL") - let groupDir = FileManager.default.groupDir() - let path = "\(groupDir)/\(name)\(isOfficial ? "" : "-experimental").db" - - self.init(path: path) - } - - func query(raw: SQL, _ args: QueryArgs = []) -> [T] { - guard let results = try? queryRaw(raw, args) else { - return [] - } - - return results.compactMap { result in - guard let dictionary = result.resultDictionary else { - return nil - } - - guard let data = try? JSONSerialization.data(withJSONObject: dictionary) else { - return nil - } - - guard let item = try? JSONDecoder().decode(T.self, from: data) else { - return nil - } - - return item - } - } -} diff --git a/ios/Shared/Models/DecryptedContent.swift b/ios/Shared/Models/DecryptedContent.swift new file mode 100644 index 0000000000..50a4f3e848 --- /dev/null +++ b/ios/Shared/Models/DecryptedContent.swift @@ -0,0 +1,13 @@ +// +// DecryptedContent.swift +// RocketChatRN +// +// Created by Diego Mello on 9/13/24. +// Copyright © 2024 Facebook. All rights reserved. +// + +import Foundation + +struct DecryptedContent: Codable { + let msg: String +} diff --git a/ios/Shared/Models/EncryptedContent.swift b/ios/Shared/Models/EncryptedContent.swift new file mode 100644 index 0000000000..90b0f5430c --- /dev/null +++ b/ios/Shared/Models/EncryptedContent.swift @@ -0,0 +1,14 @@ +// +// EncryptedContent.swift +// RocketChatRN +// +// Created by Diego Mello on 9/13/24. +// Copyright © 2024 Facebook. All rights reserved. +// + +import Foundation + +struct EncryptedContent: Codable { + let algorithm: String + let ciphertext: String +} diff --git a/ios/Shared/Models/Payload.swift b/ios/Shared/Models/Payload.swift index a7db8fdbc4..124ccf612e 100644 --- a/ios/Shared/Models/Payload.swift +++ b/ios/Shared/Models/Payload.swift @@ -20,4 +20,5 @@ struct Payload: Codable { let msg: String? let senderName: String? let tmid: String? + let content: EncryptedContent? } diff --git a/ios/Shared/RocketChat/Database.swift b/ios/Shared/RocketChat/Database.swift index db493fa8af..f51166a6db 100644 --- a/ios/Shared/RocketChat/Database.swift +++ b/ios/Shared/RocketChat/Database.swift @@ -7,45 +7,120 @@ // import Foundation -import WatermelonDB - -final class Database { - private let database: WatermelonDB.Database - - init(server: String) { - let domain = URL(string: server)?.domain ?? "" - database = .init(name: domain) - } - - func readRoomEncryptionKey(rid: String) -> String? { - if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { - guard let record = results.next() else { - return nil - } - - if let room = record.resultDictionary as? [String: Any] { - if let e2eKey = room["e2e_key"] as? String { - return e2eKey - } - } - } - - return nil - } - - func readRoomEncrypted(rid: String) -> Bool { - if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { - guard let record = results.next() else { - return false - } - - if let room = record.resultDictionary as? [String: Any] { - if let encrypted = room["encrypted"] as? Bool { - return encrypted - } - } - } - - return false - } +import SQLite3 + +class Database { + var db: OpaquePointer? + + init(name: String) { + if let dbPath = self.getDatabasePath(name: name) { + openDatabase(databasePath: dbPath) + } else { + print("Could not resolve database path for name: \(name)") + } + } + + init(server: String) { + let domain = URL(string: server)?.domain ?? "" + if let dbPath = self.getDatabasePath(name: domain) { + openDatabase(databasePath: dbPath) + } else { + print("Could not resolve database path for server: \(server)") + } + } + + func getDatabasePath(name: String) -> String? { + let isOfficial = Bundle.main.bool(forKey: "IS_OFFICIAL") + let groupDir = FileManager.default.groupDir() + return "\(groupDir)/\(name)\(isOfficial ? "" : "-experimental").db" + } + + func openDatabase(databasePath: String) { + if sqlite3_open(databasePath, &db) == SQLITE_OK { + print("Successfully opened database at \(databasePath)") + } else { + print("Unable to open database.") + } + } + + func closeDatabase() { + if sqlite3_close(db) != SQLITE_OK { + print("Error closing database") + } else { + print("Database closed successfully") + } + db = nil + } + + deinit { + closeDatabase() + } + + func query(_ query: String, args: [String] = []) -> [[String: Any]]? { + var statement: OpaquePointer? + var results: [[String: Any]] = [] + + if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK { + for (index, arg) in args.enumerated() { + sqlite3_bind_text(statement, Int32(index + 1), arg, -1, unsafeBitCast(-1, to: sqlite3_destructor_type.self)) + } + + while sqlite3_step(statement) == SQLITE_ROW { + var row: [String: Any] = [:] + for columnIndex in 0..(_ result: [[String: Any]]) -> [T]? { + do { + let jsonData = try JSONSerialization.data(withJSONObject: result, options: []) + let decodedObjects = try JSONDecoder().decode([T].self, from: jsonData) + return decodedObjects + } catch { + print("Failed to decode result: \(error)") + return nil + } + } + + func readRoomEncryptionKey(for roomId: String) -> String? { + let query = "SELECT e2e_key FROM subscriptions WHERE rid = ? LIMIT 1" + if let results = self.query(query, args: [roomId]), let firstResult = results.first { + return firstResult["e2e_key"] as? String + } + return nil + } + + func readRoomEncrypted(for roomId: String) -> Bool { + let query = "SELECT encrypted FROM subscriptions WHERE rid = ? LIMIT 1" + if let results = self.query(query, args: [roomId]), let firstResult = results.first { + if let encrypted = firstResult["encrypted"] as? NSNumber { + return encrypted.boolValue + } + } + return false + } } diff --git a/ios/Shared/RocketChat/Encryption.swift b/ios/Shared/RocketChat/Encryption.swift index 97b1f28baf..2b23585973 100644 --- a/ios/Shared/RocketChat/Encryption.swift +++ b/ios/Shared/RocketChat/Encryption.swift @@ -43,7 +43,7 @@ final class Encryption { self.server = server self.rid = rid - if let E2EKey = Database(server: server).readRoomEncryptionKey(rid: rid) { + if let E2EKey = Database(server: server).readRoomEncryptionKey(for: rid) { self.roomKey = decryptRoomKey(E2EKey: E2EKey) } } @@ -78,9 +78,14 @@ final class Encryption { let iv = data.subdata(in: 0.. String? { encryptionQueue.sync { - if let encryption = encryptionInstances[rid] { - return encryption.decryptMessage(message: message) - } - let encryption = Encryption(server: server, rid: rid) - encryptionInstances[rid] = encryption return encryption.decryptMessage(message: message) } } func encryptMessage(rid: String, id: String, message: String) -> String { encryptionQueue.sync { - if let encryption = encryptionInstances[rid] { - return encryption.encryptMessage(id: id, message: message) - } - let encryption = Encryption(server: server, rid: rid) - encryptionInstances[rid] = encryption return encryption.encryptMessage(id: id, message: message) } } diff --git a/ios/Watch/WatchConnection.swift b/ios/Watch/WatchConnection.swift index defa29527a..311d8c4c89 100644 --- a/ios/Watch/WatchConnection.swift +++ b/ios/Watch/WatchConnection.swift @@ -1,10 +1,9 @@ import Foundation -import WatermelonDB import WatchConnectivity @objc final class WatchConnection: NSObject { - private let database = WatermelonDB.Database(name: "default") + private let database = Database(name: "default") private let mmkv = MMKV.build() private let session: WCSession @@ -17,59 +16,84 @@ final class WatchConnection: NSObject { session.activate() } } - - private func getMessage() -> WatchMessage { - let serversQuery = database.query(raw: "select * from servers") as [DBServer] - - let servers = serversQuery.compactMap { item -> WatchMessage.Server? in - guard let userId = mmkv.userId(for: item.identifier), let userToken = mmkv.userToken(for: userId) else { - return nil - } - - let clientSSL = SSLPinning().getCertificate(server: item.url.absoluteString.removeTrailingSlash()) - - let usersQuery = database.query(raw: "select * from users where token == ? limit 1", [userToken]) as [DBUser] - - guard let user = usersQuery.first else { - return nil - } - - return WatchMessage.Server( - url: item.url, - name: item.name, - iconURL: item.iconURL, - useRealName: item.useRealName == 1 ? true : false, - loggedUser: .init( - id: userId, - token: userToken, - name: user.name, - username: user.username - ), - clientSSL: clientSSL.map { - .init( - certificate: $0.certificate, - password: $0.password - ) - }, - version: item.version - ) - } - - return WatchMessage(servers: servers) - } + + func getServers() -> [DBServer]? { + guard let serversQuery = database.query("select * from servers") else { + print("No servers found") + return nil + } + + return database.decodeQueryResult(serversQuery) + } + + func getUsers(userToken: String) -> [DBUser]? { + guard let usersQuery = database.query("select * from users where token == ? limit 1", args: [userToken]) else { + print("No users found") + return nil + } + + return database.decodeQueryResult(usersQuery) + } + + private func getMessage() -> WatchMessage? { + guard let serversQuery = getServers() else { + return nil + } + + let servers = serversQuery.compactMap { item -> WatchMessage.Server? in + guard let userId = mmkv.userId(for: item.identifier), let userToken = mmkv.userToken(for: userId) else { + return nil + } + + let clientSSL = SSLPinning().getCertificate(server: item.url.absoluteString.removeTrailingSlash()) + + guard let usersQuery = getUsers(userToken: userToken) else { + return nil + } + + guard let user = usersQuery.first else { + return nil + } + + return WatchMessage.Server( + url: item.url, + name: item.name, + iconURL: item.iconURL, + useRealName: item.useRealName == 1 ? true : false, + loggedUser: .init( + id: userId, + token: userToken, + name: user.name, + username: user.username + ), + clientSSL: clientSSL.map { + .init( + certificate: $0.certificate, + password: $0.password + ) + }, + version: item.version + ) + } + + return WatchMessage(servers: servers) + } private func encodedMessage() -> [String: Any] { - do { - let data = try JSONEncoder().encode(getMessage()) - - guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { - fatalError("Could not serialize message: \(getMessage())") - } - - return dictionary - } catch { - fatalError("Could not encode message: \(getMessage())") - } + do { + guard let message = getMessage() else { + fatalError("Message is null") + } + let data = try JSONEncoder().encode(message) + + guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { + fatalError("Could not serialize message: \(message)") + } + + return dictionary + } catch { + fatalError("Could not encode message") + } } } diff --git a/package.json b/package.json index 17335516b6..97a562efde 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", "@hookform/resolvers": "^2.9.10", "@notifee/react-native": "7.8.2", - "@nozbe/watermelondb": "0.25.5", + "@nozbe/watermelondb": "^0.27.1", "@react-native-async-storage/async-storage": "^1.22.3", "@react-native-camera-roll/camera-roll": "^7.5.0", "@react-native-clipboard/clipboard": "^1.13.2", diff --git a/patches/@nozbe+watermelondb+0.25.5.patch b/patches/@nozbe+watermelondb+0.25.5.patch deleted file mode 100644 index e9f877ed27..0000000000 --- a/patches/@nozbe+watermelondb+0.25.5.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff --git a/node_modules/@nozbe/watermelondb/native/android/src/main/java/com/nozbe/watermelondb/Database.kt b/node_modules/@nozbe/watermelondb/native/android/src/main/java/com/nozbe/watermelondb/Database.kt -index ca31e20..1c1bc24 100644 ---- a/node_modules/@nozbe/watermelondb/native/android/src/main/java/com/nozbe/watermelondb/Database.kt -+++ b/node_modules/@nozbe/watermelondb/native/android/src/main/java/com/nozbe/watermelondb/Database.kt -@@ -8,7 +8,7 @@ import android.database.sqlite.SQLiteDatabase - import android.database.sqlite.SQLiteQuery - import java.io.File - --class Database( -+public class Database( - private val name: String, - private val context: Context, - private val openFlags: Int = SQLiteDatabase.CREATE_IF_NECESSARY or SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING -@@ -49,7 +49,7 @@ class Database( - - fun delete(query: SQL, args: QueryArgs) = db.execSQL(query, args) - -- fun rawQuery(sql: SQL, args: QueryArgs = emptyArray()): Cursor { -+ public fun rawQuery(sql: SQL, args: QueryArgs = emptyArray()): Cursor { - // HACK: db.rawQuery only supports String args, and there's no clean way AFAIK to construct - // a query with arbitrary args (like with execSQL). However, we can misuse cursor factory - // to get the reference of a SQLiteQuery before it's executed -diff --git a/node_modules/@nozbe/watermelondb/native/ios/WatermelonDB/Database.swift b/node_modules/@nozbe/watermelondb/native/ios/WatermelonDB/Database.swift -index b4d7151..429e318 100644 ---- a/node_modules/@nozbe/watermelondb/native/ios/WatermelonDB/Database.swift -+++ b/node_modules/@nozbe/watermelondb/native/ios/WatermelonDB/Database.swift -@@ -1,15 +1,15 @@ - import Foundation - import SQLite3 - --class Database { -- typealias SQL = String -- typealias TableName = String -- typealias QueryArgs = [Any] -+public class Database { -+ public typealias SQL = String -+ public typealias TableName = String -+ public typealias QueryArgs = [Any] - - private let fmdb: FMDatabase - private let path: String - -- init(path: String) { -+ public init(path: String) { - self.path = path - fmdb = FMDatabase(path: path) - open() -@@ -54,7 +54,7 @@ class Database { - } - } - -- func queryRaw(_ query: SQL, _ args: QueryArgs = []) throws -> AnyIterator { -+ public func queryRaw(_ query: SQL, _ args: QueryArgs = []) throws -> AnyIterator { - let resultSet = try fmdb.executeQuery(query, values: args) - - return AnyIterator { diff --git a/yarn.lock b/yarn.lock index afd1efe535..c18900cf33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2029,7 +2029,14 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== @@ -3246,36 +3253,28 @@ resolved "https://registry.yarnpkg.com/@notifee/react-native/-/react-native-7.8.2.tgz#72d3199ae830b4128ddaef3c1c2f11604759c9c4" integrity sha512-VG4IkWJIlOKqXwa3aExC3WFCVCGCC9BA55Ivg0SMRfEs+ruvYy/zlLANcrVGiPtgkUEryXDhA8SXx9+JcO8oLA== -"@nozbe/simdjson@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nozbe/simdjson/-/simdjson-1.0.0.tgz#9327962214c98e046bea44d0d56a70e10d9d7ce8" - integrity sha512-lm/MNUneznK65NNbmvawOn+OFYMjeBga+xEBACda4hTpZBnJhIgfLIxpYvx40sIeihRX0v7WiEB7VwQO9FIMAg== +"@nozbe/simdjson@3.1.0-wmelon1": + version "3.1.0-wmelon1" + resolved "https://registry.yarnpkg.com/@nozbe/simdjson/-/simdjson-3.1.0-wmelon1.tgz#e02048b41d2b3662ddf1dc8c979a3a36fd389dfb" + integrity sha512-PQaHHQyvASrcrfzqkZ4ona43m0UjN81NuTWt6rJkOUePGDjxc8MNp2Q7jcod1CIdTsXJ13wRWeFbquwNfhpIQQ== -"@nozbe/sqlite@3.36.0": - version "3.36.0" - resolved "https://registry.yarnpkg.com/@nozbe/sqlite/-/sqlite-3.36.0.tgz#80a46f8cb4a502a068ec1a5bef665dd65350ea7c" - integrity sha512-wKTFGvgf5V+bYlhXdukOWKH0XgdG0NmUQwLWG7w5Yk4EUeQS29D5uWPCeWT1Ac/NzDKuHsYP6KVOJDbJSauAAg== - -"@nozbe/watermelondb@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@nozbe/watermelondb/-/watermelondb-0.25.5.tgz#706aef57d92f8301ceb3d8430362197e810c2578" - integrity sha512-/c84A7+3Ack8X8eFUXrvHMgIdk+Qz/3Vfkr5A2bQtHpXOLOGSbS6oXGdZTu+PYzLm4VlKZ68F9tF6yFVIVydiA== - dependencies: - "@babel/runtime" "^7.11.2" - "@nozbe/simdjson" "1.0.0" - "@nozbe/sqlite" "3.36.0" - "@nozbe/with-observables" "1.4.1" - hoist-non-react-statics "^3.3.2" - lokijs "npm:@nozbe/lokijs@1.5.12-wmelon6" - rxjs "^7.4.0" - sql-escape-string "^1.1.0" +"@nozbe/sqlite@3.40.1": + version "3.40.1" + resolved "https://registry.yarnpkg.com/@nozbe/sqlite/-/sqlite-3.40.1.tgz#4218074ce8c87c859465dd2db28cd4b2fc7192b9" + integrity sha512-uKJOW4sQi3neCmgKhqLr0IJKlb2y5q2p05U5CEDJrCxSyD2uVYvSdh7IMrPjF4sWtzc/Lnk462M4vde7Dn5NSw== -"@nozbe/with-observables@1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@nozbe/with-observables/-/with-observables-1.4.1.tgz#e24680e57ae235e53db6ed7600494d7d0a8d36c2" - integrity sha512-xsYrSeSzelFiWF/BXFZW+khFAqJdet22Egt6nhVLHGF2GmYbV5kxv8om0Wh2om4OXK6IM0UAU3pwk+nX5GLsUw== +"@nozbe/watermelondb@^0.27.1": + version "0.27.1" + resolved "https://registry.yarnpkg.com/@nozbe/watermelondb/-/watermelondb-0.27.1.tgz#06fdae74c986a9149fb7bfc52ae41da4b99d802b" + integrity sha512-41Nlq0FMGkcr2CUgtPRQRVAbA8VYI6fpeGlX4eoiLhoh3nbPIlX4RIcjLIEoyGgkCUSNSnNvXrv0RMIJRl4nZQ== dependencies: + "@babel/runtime" "7.21.0" + "@nozbe/simdjson" "3.1.0-wmelon1" + "@nozbe/sqlite" "3.40.1" hoist-non-react-statics "^3.3.2" + lokijs "npm:@nozbe/lokijs@1.5.12-wmelon6" + rxjs "^7.8.0" + sql-escape-string "^1.1.0" "@npmcli/fs@^1.0.0": version "1.1.1" @@ -12461,7 +12460,7 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.2: +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== @@ -12702,7 +12701,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.4.0, rxjs@^7.5.1: +rxjs@^7.5.1, rxjs@^7.8.0: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==