From faa4473109f8fff0b8dbc0351b71f30dfe0adb7b Mon Sep 17 00:00:00 2001 From: Frederic Jacobs Date: Fri, 21 Nov 2014 19:52:34 +0100 Subject: [PATCH] SubProto support for WebSocket messages --- Signal.xcodeproj/project.pbxproj | 216 ++-- .../textsecure/Messages/TSMessagesManager.h | 3 +- .../textsecure/Messages/TSMessagesManager.m | 4 +- .../Requests/TSContactsIntersectionRequest.h | 0 .../Requests/TSContactsIntersectionRequest.m | 0 .../Requests/TSDeregisterAccountRequest.h | 0 .../Requests/TSDeregisterAccountRequest.m | 0 .../Requests/TSRecipientPrekeyRequest.h | 0 .../Requests/TSRecipientPrekeyRequest.m | 0 .../Requests/TSRegisterForPushRequest.h | 0 .../Requests/TSRegisterForPushRequest.m | 0 .../Requests/TSRegisterPrekeysRequest.h | 0 .../Requests/TSRegisterPrekeysRequest.m | 0 .../Requests/TSRegisterWithTokenRequest.h | 0 .../Requests/TSRegisterWithTokenRequest.m | 0 .../Network/{ => API}/Requests/TSRequest.h | 0 .../Network/{ => API}/Requests/TSRequest.m | 0 .../{ => API}/Requests/TSRequestAttachment.h | 0 .../{ => API}/Requests/TSRequestAttachment.m | 0 .../Requests/TSRequestAttachmentId.h | 0 .../Requests/TSRequestAttachmentId.m | 0 .../Requests/TSSubmitMessageRequest.h | 0 .../Requests/TSSubmitMessageRequest.m | 0 .../{ => API}/Requests/TSUploadAttachment.h | 0 .../{ => API}/Requests/TSUploadAttachment.m | 0 .../Network/{ => API}/TSNetworkManager.h | 0 .../Network/{ => API}/TSNetworkManager.m | 14 +- .../Network/WebSockets/SubProtocol.pb.h | 264 +++++ .../Network/WebSockets/SubProtocol.pb.m | 1051 +++++++++++++++++ .../Network/WebSockets/SubProtocol.proto | 45 + .../{ => WebSockets}/TSSocketManager.h | 0 .../{ => WebSockets}/TSSocketManager.m | 62 +- 32 files changed, 1523 insertions(+), 136 deletions(-) rename Signal/src/textsecure/Network/{ => API}/Requests/TSContactsIntersectionRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSContactsIntersectionRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSDeregisterAccountRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSDeregisterAccountRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRecipientPrekeyRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRecipientPrekeyRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterForPushRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterForPushRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterPrekeysRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterPrekeysRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterWithTokenRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRegisterWithTokenRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequestAttachment.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequestAttachment.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequestAttachmentId.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSRequestAttachmentId.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSSubmitMessageRequest.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSSubmitMessageRequest.m (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSUploadAttachment.h (100%) rename Signal/src/textsecure/Network/{ => API}/Requests/TSUploadAttachment.m (100%) rename Signal/src/textsecure/Network/{ => API}/TSNetworkManager.h (100%) rename Signal/src/textsecure/Network/{ => API}/TSNetworkManager.m (82%) create mode 100644 Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.h create mode 100644 Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.m create mode 100644 Signal/src/textsecure/Network/WebSockets/SubProtocol.proto rename Signal/src/textsecure/Network/{ => WebSockets}/TSSocketManager.h (100%) rename Signal/src/textsecure/Network/{ => WebSockets}/TSSocketManager.m (73%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 7eb773b0d..7835dd012 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -412,6 +412,20 @@ B63761ED19E1FBE8005735D1 /* HttpRequestOrResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B63761E719E1FBE8005735D1 /* HttpRequestOrResponse.m */; }; B63761EE19E1FBE8005735D1 /* HttpRequestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B63761E919E1FBE8005735D1 /* HttpRequestUtil.m */; }; B63761EF19E1FBE8005735D1 /* HttpResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B63761EB19E1FBE8005735D1 /* HttpResponse.m */; }; + B63AF5C71A1F757900D01AAD /* TSContactsIntersectionRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5AD1A1F757900D01AAD /* TSContactsIntersectionRequest.m */; }; + B63AF5C81A1F757900D01AAD /* TSDeregisterAccountRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5AF1A1F757900D01AAD /* TSDeregisterAccountRequest.m */; }; + B63AF5C91A1F757900D01AAD /* TSRecipientPrekeyRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5B11A1F757900D01AAD /* TSRecipientPrekeyRequest.m */; }; + B63AF5CA1A1F757900D01AAD /* TSRegisterForPushRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5B31A1F757900D01AAD /* TSRegisterForPushRequest.m */; }; + B63AF5CB1A1F757900D01AAD /* TSRegisterPrekeysRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5B51A1F757900D01AAD /* TSRegisterPrekeysRequest.m */; }; + B63AF5CC1A1F757900D01AAD /* TSRegisterWithTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5B71A1F757900D01AAD /* TSRegisterWithTokenRequest.m */; }; + B63AF5CD1A1F757900D01AAD /* TSRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5B91A1F757900D01AAD /* TSRequest.m */; }; + B63AF5CE1A1F757900D01AAD /* TSRequestAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5BB1A1F757900D01AAD /* TSRequestAttachment.m */; }; + B63AF5CF1A1F757900D01AAD /* TSRequestAttachmentId.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5BD1A1F757900D01AAD /* TSRequestAttachmentId.m */; }; + B63AF5D01A1F757900D01AAD /* TSSubmitMessageRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5BF1A1F757900D01AAD /* TSSubmitMessageRequest.m */; }; + B63AF5D11A1F757900D01AAD /* TSUploadAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5C11A1F757900D01AAD /* TSUploadAttachment.m */; }; + B63AF5D21A1F757900D01AAD /* TSNetworkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5C31A1F757900D01AAD /* TSNetworkManager.m */; }; + B63AF5D31A1F757900D01AAD /* TSSocketManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5C61A1F757900D01AAD /* TSSocketManager.m */; }; + B63AF5D81A1F889500D01AAD /* SubProtocol.pb.m in Sources */ = {isa = PBXBuildFile; fileRef = B63AF5D71A1F889500D01AAD /* SubProtocol.pb.m */; settings = {COMPILER_FLAGS = "-w"; }; }; B6416FB8199A0478003C5699 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6416F57199A0478003C5699 /* Localizable.strings */; }; B65EDA1219E1BE6400AAA7CB /* RPAPICall.m in Sources */ = {isa = PBXBuildFile; fileRef = B65EDA1119E1BE6400AAA7CB /* RPAPICall.m */; }; B66DBF4A19D5BBC8006EA940 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B66DBF4919D5BBC8006EA940 /* Images.xcassets */; }; @@ -450,19 +464,6 @@ B6B096741A1D25ED008BFAA6 /* TSMessagesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096161A1D25ED008BFAA6 /* TSMessagesManager.m */; }; B6B096751A1D25ED008BFAA6 /* TSOutgoingMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096181A1D25ED008BFAA6 /* TSOutgoingMessage.m */; }; B6B096761A1D25ED008BFAA6 /* TSServerMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0961A1A1D25ED008BFAA6 /* TSServerMessage.m */; }; - B6B096771A1D25ED008BFAA6 /* TSContactsIntersectionRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0961E1A1D25ED008BFAA6 /* TSContactsIntersectionRequest.m */; }; - B6B096781A1D25ED008BFAA6 /* TSDeregisterAccountRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096201A1D25ED008BFAA6 /* TSDeregisterAccountRequest.m */; }; - B6B096791A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096221A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.m */; }; - B6B0967A1A1D25ED008BFAA6 /* TSRegisterForPushRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096241A1D25ED008BFAA6 /* TSRegisterForPushRequest.m */; }; - B6B0967B1A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096261A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.m */; }; - B6B0967C1A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096281A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.m */; }; - B6B0967D1A1D25ED008BFAA6 /* TSRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0962A1A1D25ED008BFAA6 /* TSRequest.m */; }; - B6B0967E1A1D25ED008BFAA6 /* TSRequestAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0962C1A1D25ED008BFAA6 /* TSRequestAttachment.m */; }; - B6B0967F1A1D25ED008BFAA6 /* TSRequestAttachmentId.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0962E1A1D25ED008BFAA6 /* TSRequestAttachmentId.m */; }; - B6B096821A1D25ED008BFAA6 /* TSSubmitMessageRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096341A1D25ED008BFAA6 /* TSSubmitMessageRequest.m */; }; - B6B096831A1D25ED008BFAA6 /* TSUploadAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096361A1D25ED008BFAA6 /* TSUploadAttachment.m */; }; - B6B096841A1D25ED008BFAA6 /* TSNetworkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096381A1D25ED008BFAA6 /* TSNetworkManager.m */; }; - B6B096851A1D25ED008BFAA6 /* TSSocketManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0963A1A1D25ED008BFAA6 /* TSSocketManager.m */; }; B6B096861A1D25ED008BFAA6 /* SecurityUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B0963D1A1D25ED008BFAA6 /* SecurityUtils.m */; }; B6B096871A1D25ED008BFAA6 /* TSStorageManager+IdentityKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096411A1D25ED008BFAA6 /* TSStorageManager+IdentityKeyStore.m */; }; B6B096881A1D25ED008BFAA6 /* TSStorageManager+keyFromIntLong.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B096431A1D25ED008BFAA6 /* TSStorageManager+keyFromIntLong.m */; }; @@ -523,9 +524,6 @@ E1370BE418A0686C00826894 /* outring.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = E18AB40B18A05754001A532A /* outring.mp3 */; }; E1370BE518A0686C00826894 /* r.caf in Resources */ = {isa = PBXBuildFile; fileRef = E18AB40C18A05754001A532A /* r.caf */; }; E1370BE618A0686C00826894 /* sonarping.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = E18AB40D18A05754001A532A /* sonarping.mp3 */; }; - E1370BE718A0688300826894 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E1370BDA18A066F600826894 /* Default-568h@2x.png */; }; - E1370BE818A0688300826894 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = E1370BDB18A066F600826894 /* Default.png */; }; - E1370BE918A0688300826894 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E1370BDC18A066F600826894 /* Default@2x.png */; }; E1370BEA18A0689000826894 /* AppIcon29x29.jpg in Resources */ = {isa = PBXBuildFile; fileRef = E18AB3F418A05734001A532A /* AppIcon29x29.jpg */; }; E1370BEB18A0689000826894 /* AppIcon29x29.png in Resources */ = {isa = PBXBuildFile; fileRef = E18AB3F518A05734001A532A /* AppIcon29x29.png */; }; E1370BEC18A0689000826894 /* AppIcon29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E18AB3F618A05734001A532A /* AppIcon29x29@2x.png */; }; @@ -1072,6 +1070,34 @@ B63761E919E1FBE8005735D1 /* HttpRequestUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpRequestUtil.m; sourceTree = ""; }; B63761EA19E1FBE8005735D1 /* HttpResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HttpResponse.h; sourceTree = ""; }; B63761EB19E1FBE8005735D1 /* HttpResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HttpResponse.m; sourceTree = ""; }; + B63AF5AC1A1F757900D01AAD /* TSContactsIntersectionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSContactsIntersectionRequest.h; sourceTree = ""; }; + B63AF5AD1A1F757900D01AAD /* TSContactsIntersectionRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSContactsIntersectionRequest.m; sourceTree = ""; }; + B63AF5AE1A1F757900D01AAD /* TSDeregisterAccountRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSDeregisterAccountRequest.h; sourceTree = ""; }; + B63AF5AF1A1F757900D01AAD /* TSDeregisterAccountRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSDeregisterAccountRequest.m; sourceTree = ""; }; + B63AF5B01A1F757900D01AAD /* TSRecipientPrekeyRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRecipientPrekeyRequest.h; sourceTree = ""; }; + B63AF5B11A1F757900D01AAD /* TSRecipientPrekeyRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRecipientPrekeyRequest.m; sourceTree = ""; }; + B63AF5B21A1F757900D01AAD /* TSRegisterForPushRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterForPushRequest.h; sourceTree = ""; }; + B63AF5B31A1F757900D01AAD /* TSRegisterForPushRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterForPushRequest.m; sourceTree = ""; }; + B63AF5B41A1F757900D01AAD /* TSRegisterPrekeysRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterPrekeysRequest.h; sourceTree = ""; }; + B63AF5B51A1F757900D01AAD /* TSRegisterPrekeysRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterPrekeysRequest.m; sourceTree = ""; }; + B63AF5B61A1F757900D01AAD /* TSRegisterWithTokenRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterWithTokenRequest.h; sourceTree = ""; }; + B63AF5B71A1F757900D01AAD /* TSRegisterWithTokenRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterWithTokenRequest.m; sourceTree = ""; }; + B63AF5B81A1F757900D01AAD /* TSRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequest.h; sourceTree = ""; }; + B63AF5B91A1F757900D01AAD /* TSRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequest.m; sourceTree = ""; }; + B63AF5BA1A1F757900D01AAD /* TSRequestAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequestAttachment.h; sourceTree = ""; }; + B63AF5BB1A1F757900D01AAD /* TSRequestAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequestAttachment.m; sourceTree = ""; }; + B63AF5BC1A1F757900D01AAD /* TSRequestAttachmentId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequestAttachmentId.h; sourceTree = ""; }; + B63AF5BD1A1F757900D01AAD /* TSRequestAttachmentId.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequestAttachmentId.m; sourceTree = ""; }; + B63AF5BE1A1F757900D01AAD /* TSSubmitMessageRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSSubmitMessageRequest.h; sourceTree = ""; }; + B63AF5BF1A1F757900D01AAD /* TSSubmitMessageRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSSubmitMessageRequest.m; sourceTree = ""; }; + B63AF5C01A1F757900D01AAD /* TSUploadAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSUploadAttachment.h; sourceTree = ""; }; + B63AF5C11A1F757900D01AAD /* TSUploadAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSUploadAttachment.m; sourceTree = ""; }; + B63AF5C21A1F757900D01AAD /* TSNetworkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSNetworkManager.h; sourceTree = ""; }; + B63AF5C31A1F757900D01AAD /* TSNetworkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSNetworkManager.m; sourceTree = ""; }; + B63AF5C51A1F757900D01AAD /* TSSocketManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSSocketManager.h; sourceTree = ""; }; + B63AF5C61A1F757900D01AAD /* TSSocketManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSSocketManager.m; sourceTree = ""; }; + B63AF5D61A1F889500D01AAD /* SubProtocol.pb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubProtocol.pb.h; sourceTree = ""; }; + B63AF5D71A1F889500D01AAD /* SubProtocol.pb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubProtocol.pb.m; sourceTree = ""; }; B6416F37199A0478003C5699 /* an */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = an; path = Localizable.strings; sourceTree = ""; }; B6416F3A199A0478003C5699 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = Localizable.strings; sourceTree = ""; }; B6416F3D199A0478003C5699 /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = Localizable.strings; sourceTree = ""; }; @@ -1176,32 +1202,6 @@ B6B096181A1D25ED008BFAA6 /* TSOutgoingMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSOutgoingMessage.m; sourceTree = ""; }; B6B096191A1D25ED008BFAA6 /* TSServerMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSServerMessage.h; sourceTree = ""; }; B6B0961A1A1D25ED008BFAA6 /* TSServerMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSServerMessage.m; sourceTree = ""; }; - B6B0961D1A1D25ED008BFAA6 /* TSContactsIntersectionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSContactsIntersectionRequest.h; sourceTree = ""; }; - B6B0961E1A1D25ED008BFAA6 /* TSContactsIntersectionRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSContactsIntersectionRequest.m; sourceTree = ""; }; - B6B0961F1A1D25ED008BFAA6 /* TSDeregisterAccountRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSDeregisterAccountRequest.h; sourceTree = ""; }; - B6B096201A1D25ED008BFAA6 /* TSDeregisterAccountRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSDeregisterAccountRequest.m; sourceTree = ""; }; - B6B096211A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRecipientPrekeyRequest.h; sourceTree = ""; }; - B6B096221A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRecipientPrekeyRequest.m; sourceTree = ""; }; - B6B096231A1D25ED008BFAA6 /* TSRegisterForPushRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterForPushRequest.h; sourceTree = ""; }; - B6B096241A1D25ED008BFAA6 /* TSRegisterForPushRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterForPushRequest.m; sourceTree = ""; }; - B6B096251A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterPrekeysRequest.h; sourceTree = ""; }; - B6B096261A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterPrekeysRequest.m; sourceTree = ""; }; - B6B096271A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRegisterWithTokenRequest.h; sourceTree = ""; }; - B6B096281A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRegisterWithTokenRequest.m; sourceTree = ""; }; - B6B096291A1D25ED008BFAA6 /* TSRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequest.h; sourceTree = ""; }; - B6B0962A1A1D25ED008BFAA6 /* TSRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequest.m; sourceTree = ""; }; - B6B0962B1A1D25ED008BFAA6 /* TSRequestAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequestAttachment.h; sourceTree = ""; }; - B6B0962C1A1D25ED008BFAA6 /* TSRequestAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequestAttachment.m; sourceTree = ""; }; - B6B0962D1A1D25ED008BFAA6 /* TSRequestAttachmentId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSRequestAttachmentId.h; sourceTree = ""; }; - B6B0962E1A1D25ED008BFAA6 /* TSRequestAttachmentId.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSRequestAttachmentId.m; sourceTree = ""; }; - B6B096331A1D25ED008BFAA6 /* TSSubmitMessageRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSSubmitMessageRequest.h; sourceTree = ""; }; - B6B096341A1D25ED008BFAA6 /* TSSubmitMessageRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSSubmitMessageRequest.m; sourceTree = ""; }; - B6B096351A1D25ED008BFAA6 /* TSUploadAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSUploadAttachment.h; sourceTree = ""; }; - B6B096361A1D25ED008BFAA6 /* TSUploadAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSUploadAttachment.m; sourceTree = ""; }; - B6B096371A1D25ED008BFAA6 /* TSNetworkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSNetworkManager.h; sourceTree = ""; }; - B6B096381A1D25ED008BFAA6 /* TSNetworkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSNetworkManager.m; sourceTree = ""; }; - B6B096391A1D25ED008BFAA6 /* TSSocketManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSSocketManager.h; sourceTree = ""; }; - B6B0963A1A1D25ED008BFAA6 /* TSSocketManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSSocketManager.m; sourceTree = ""; }; B6B0963C1A1D25ED008BFAA6 /* SecurityUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecurityUtils.h; sourceTree = ""; }; B6B0963D1A1D25ED008BFAA6 /* SecurityUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SecurityUtils.m; sourceTree = ""; }; B6B096401A1D25ED008BFAA6 /* TSStorageManager+IdentityKeyStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "TSStorageManager+IdentityKeyStore.h"; sourceTree = ""; }; @@ -2380,6 +2380,65 @@ path = Images; sourceTree = ""; }; + B63AF5A91A1F757900D01AAD /* Network */ = { + isa = PBXGroup; + children = ( + B63AF5AA1A1F757900D01AAD /* API */, + B63AF5C41A1F757900D01AAD /* WebSockets */, + ); + path = Network; + sourceTree = ""; + }; + B63AF5AA1A1F757900D01AAD /* API */ = { + isa = PBXGroup; + children = ( + B63AF5AB1A1F757900D01AAD /* Requests */, + B63AF5C21A1F757900D01AAD /* TSNetworkManager.h */, + B63AF5C31A1F757900D01AAD /* TSNetworkManager.m */, + ); + path = API; + sourceTree = ""; + }; + B63AF5AB1A1F757900D01AAD /* Requests */ = { + isa = PBXGroup; + children = ( + B63AF5AC1A1F757900D01AAD /* TSContactsIntersectionRequest.h */, + B63AF5AD1A1F757900D01AAD /* TSContactsIntersectionRequest.m */, + B63AF5AE1A1F757900D01AAD /* TSDeregisterAccountRequest.h */, + B63AF5AF1A1F757900D01AAD /* TSDeregisterAccountRequest.m */, + B63AF5B01A1F757900D01AAD /* TSRecipientPrekeyRequest.h */, + B63AF5B11A1F757900D01AAD /* TSRecipientPrekeyRequest.m */, + B63AF5B21A1F757900D01AAD /* TSRegisterForPushRequest.h */, + B63AF5B31A1F757900D01AAD /* TSRegisterForPushRequest.m */, + B63AF5B41A1F757900D01AAD /* TSRegisterPrekeysRequest.h */, + B63AF5B51A1F757900D01AAD /* TSRegisterPrekeysRequest.m */, + B63AF5B61A1F757900D01AAD /* TSRegisterWithTokenRequest.h */, + B63AF5B71A1F757900D01AAD /* TSRegisterWithTokenRequest.m */, + B63AF5B81A1F757900D01AAD /* TSRequest.h */, + B63AF5B91A1F757900D01AAD /* TSRequest.m */, + B63AF5BA1A1F757900D01AAD /* TSRequestAttachment.h */, + B63AF5BB1A1F757900D01AAD /* TSRequestAttachment.m */, + B63AF5BC1A1F757900D01AAD /* TSRequestAttachmentId.h */, + B63AF5BD1A1F757900D01AAD /* TSRequestAttachmentId.m */, + B63AF5BE1A1F757900D01AAD /* TSSubmitMessageRequest.h */, + B63AF5BF1A1F757900D01AAD /* TSSubmitMessageRequest.m */, + B63AF5C01A1F757900D01AAD /* TSUploadAttachment.h */, + B63AF5C11A1F757900D01AAD /* TSUploadAttachment.m */, + ); + path = Requests; + sourceTree = ""; + }; + B63AF5C41A1F757900D01AAD /* WebSockets */ = { + isa = PBXGroup; + children = ( + B63AF5D61A1F889500D01AAD /* SubProtocol.pb.h */, + B63AF5D71A1F889500D01AAD /* SubProtocol.pb.m */, + B63AF5C51A1F757900D01AAD /* TSSocketManager.h */, + B63AF5C61A1F757900D01AAD /* TSSocketManager.m */, + ); + path = WebSockets; + sourceTree = ""; + }; B6416F35199A0478003C5699 /* an.lproj */ = { isa = PBXGroup; children = ( @@ -2772,7 +2831,7 @@ B6B095EB1A1D25ED008BFAA6 /* Account */, B6B095F21A1D25ED008BFAA6 /* Contacts */, B6B096001A1D25ED008BFAA6 /* Messages */, - B6B0961B1A1D25ED008BFAA6 /* Network */, + B63AF5A91A1F757900D01AAD /* Network */, B6B0963B1A1D25ED008BFAA6 /* Security */, B6B0963E1A1D25ED008BFAA6 /* Storage */, B6B096531A1D25ED008BFAA6 /* TSConstants.h */, @@ -2852,47 +2911,6 @@ path = Messages; sourceTree = ""; }; - B6B0961B1A1D25ED008BFAA6 /* Network */ = { - isa = PBXGroup; - children = ( - B6B0961C1A1D25ED008BFAA6 /* Requests */, - B6B096371A1D25ED008BFAA6 /* TSNetworkManager.h */, - B6B096381A1D25ED008BFAA6 /* TSNetworkManager.m */, - B6B096391A1D25ED008BFAA6 /* TSSocketManager.h */, - B6B0963A1A1D25ED008BFAA6 /* TSSocketManager.m */, - ); - path = Network; - sourceTree = ""; - }; - B6B0961C1A1D25ED008BFAA6 /* Requests */ = { - isa = PBXGroup; - children = ( - B6B0961D1A1D25ED008BFAA6 /* TSContactsIntersectionRequest.h */, - B6B0961E1A1D25ED008BFAA6 /* TSContactsIntersectionRequest.m */, - B6B0961F1A1D25ED008BFAA6 /* TSDeregisterAccountRequest.h */, - B6B096201A1D25ED008BFAA6 /* TSDeregisterAccountRequest.m */, - B6B096211A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.h */, - B6B096221A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.m */, - B6B096231A1D25ED008BFAA6 /* TSRegisterForPushRequest.h */, - B6B096241A1D25ED008BFAA6 /* TSRegisterForPushRequest.m */, - B6B096251A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.h */, - B6B096261A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.m */, - B6B096271A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.h */, - B6B096281A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.m */, - B6B096291A1D25ED008BFAA6 /* TSRequest.h */, - B6B0962A1A1D25ED008BFAA6 /* TSRequest.m */, - B6B0962B1A1D25ED008BFAA6 /* TSRequestAttachment.h */, - B6B0962C1A1D25ED008BFAA6 /* TSRequestAttachment.m */, - B6B0962D1A1D25ED008BFAA6 /* TSRequestAttachmentId.h */, - B6B0962E1A1D25ED008BFAA6 /* TSRequestAttachmentId.m */, - B6B096331A1D25ED008BFAA6 /* TSSubmitMessageRequest.h */, - B6B096341A1D25ED008BFAA6 /* TSSubmitMessageRequest.m */, - B6B096351A1D25ED008BFAA6 /* TSUploadAttachment.h */, - B6B096361A1D25ED008BFAA6 /* TSUploadAttachment.m */, - ); - path = Requests; - sourceTree = ""; - }; B6B0963B1A1D25ED008BFAA6 /* Security */ = { isa = PBXGroup; children = ( @@ -3548,16 +3566,13 @@ B633C5D31A1D190B0059AC12 /* search_cancel.png in Resources */, E1370BF118A0689000826894 /* AppIcon76x76.png in Resources */, E1370BF218A0689000826894 /* AppIcon76x76@2x.png in Resources */, - E1370BE718A0688300826894 /* Default-568h@2x.png in Resources */, B633C5F31A1D190B0059AC12 /* tab_icon_inbox.png in Resources */, B633C5B61A1D190B0059AC12 /* lock_white@2x.png in Resources */, B633C5DF1A1D190B0059AC12 /* signal@2x.png in Resources */, B633C5CA1A1D190B0059AC12 /* outgoing_call_icon@2x.png in Resources */, - E1370BE818A0688300826894 /* Default.png in Resources */, B633C5A11A1D190B0059AC12 /* favourite_false_icon.png in Resources */, B633C5F01A1D190B0059AC12 /* tab_icon_contacts@2x.png in Resources */, B633C5831A1D190B0059AC12 /* backspace.png in Resources */, - E1370BE918A0688300826894 /* Default@2x.png in Resources */, E1370BE018A0686600826894 /* busy.mp3 in Resources */, B633C5A01A1D190B0059AC12 /* favourite.png in Resources */, E1370BE118A0686C00826894 /* completed.mp3 in Resources */, @@ -3720,6 +3735,7 @@ 76EB05FC18170B33006006FC /* CallConnectUtil_Server.m in Sources */, 76EB062418170B33006006FC /* PriorityQueue.m in Sources */, 76EB061A18170B33006006FC /* DiscardingLog.m in Sources */, + B63AF5C71A1F757900D01AAD /* TSContactsIntersectionRequest.m in Sources */, B6B0968B1A1D25ED008BFAA6 /* TSStorageManager+SignedPreKeyStore.m in Sources */, B6B0966E1A1D25ED008BFAA6 /* TSGroupMessageManager.m in Sources */, 76EB05AC18170B33006006FC /* SrtpSocket.m in Sources */, @@ -3745,8 +3761,9 @@ FC4FA0331A1D46AE00DA100A /* InitialViewController.m in Sources */, B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */, 76EB05D618170B33006006FC /* ZrtpResponder.m in Sources */, + B63AF5C91A1F757900D01AAD /* TSRecipientPrekeyRequest.m in Sources */, 7095B7B018F46D35002C66E2 /* PhoneNumberUtil.m in Sources */, - B6B096791A1D25ED008BFAA6 /* TSRecipientPrekeyRequest.m in Sources */, + B63AF5D81A1F889500D01AAD /* SubProtocol.pb.m in Sources */, E197B61618BBEC1A00F073E5 /* StretchFactorController.m in Sources */, FCFD257F1A154B2C00F4C644 /* RegistrationViewController.m in Sources */, 76EB065018170B34006006FC /* DialerViewController.m in Sources */, @@ -3768,6 +3785,7 @@ 76EB058A18170B33006006FC /* Release.m in Sources */, 76EB061018170B33006006FC /* EventWindow.m in Sources */, E197B62718BBF63B00F073E5 /* SoundBoard.m in Sources */, + B63AF5CA1A1F757900D01AAD /* TSRegisterForPushRequest.m in Sources */, 76EB058418170B33006006FC /* LocalizableText.m in Sources */, 76EB057A18170B33006006FC /* ContactsManager.m in Sources */, B6B096611A1D25ED008BFAA6 /* TSAccountManager.m in Sources */, @@ -3789,7 +3807,6 @@ E197B61418BBEC1A00F073E5 /* DropoutTracker.m in Sources */, 76EB062C18170B33006006FC /* OperationFailed.m in Sources */, FCAC963C19FEF9280046DFC5 /* SignalsViewController.m in Sources */, - B6B0967B1A1D25ED008BFAA6 /* TSRegisterPrekeysRequest.m in Sources */, 707E549218FF26E800C8649D /* SmsInvite.m in Sources */, 76EB05DA18170B33006006FC /* LowLatencyConnector.m in Sources */, 76EB05EE18170B33006006FC /* CallTermination.m in Sources */, @@ -3797,6 +3814,7 @@ 76EB05B418170B33006006FC /* HashChain.m in Sources */, 76EB05E418170B33006006FC /* UdpSocket.m in Sources */, B6B096931A1D25ED008BFAA6 /* NSData+messagePadding.m in Sources */, + B63AF5CE1A1F757900D01AAD /* TSRequestAttachment.m in Sources */, 76EB058218170B33006006FC /* Environment.m in Sources */, 76EB064418170B33006006FC /* ThreadManager.m in Sources */, E197B61E18BBEC6D00F073E5 /* AudioRouter.m in Sources */, @@ -3812,11 +3830,12 @@ 76EB068618170B34006006FC /* ContactTableViewCell.m in Sources */, B6B096921A1D25ED008BFAA6 /* NSData+hexString.m in Sources */, B63761ED19E1FBE8005735D1 /* HttpRequestOrResponse.m in Sources */, + B63AF5C81A1F757900D01AAD /* TSDeregisterAccountRequest.m in Sources */, 76EB05A018170B33006006FC /* IpAddress.m in Sources */, B6B096651A1D25ED008BFAA6 /* TSGroupThread.m in Sources */, FCAC965119FF0A6E0046DFC5 /* MessagesViewController.m in Sources */, + B63AF5D01A1F757900D01AAD /* TSSubmitMessageRequest.m in Sources */, B6B0966B1A1D25ED008BFAA6 /* TSAttachement.m in Sources */, - B6B096851A1D25ED008BFAA6 /* TSSocketManager.m in Sources */, 76EB057618170B33006006FC /* Contact.m in Sources */, B6B0968F1A1D25ED008BFAA6 /* TSYapDatabaseObject.m in Sources */, E197B61118BBEC1A00F073E5 /* AudioProcessor.m in Sources */, @@ -3829,18 +3848,14 @@ E197B62418BBF5BB00F073E5 /* SoundPlayer.m in Sources */, E197B61018BBEC1A00F073E5 /* EncodedAudioPacket.m in Sources */, 76EB063618170B33006006FC /* DataUtil.m in Sources */, - B6B096771A1D25ED008BFAA6 /* TSContactsIntersectionRequest.m in Sources */, E197B60C18BBEC1A00F073E5 /* AudioPacker.m in Sources */, E197B61218BBEC1A00F073E5 /* AudioStretcher.m in Sources */, 76EB05A218170B33006006FC /* IpEndPoint.m in Sources */, E197B61A18BBEC1A00F073E5 /* SpeexCodec.m in Sources */, - B6B0967F1A1D25ED008BFAA6 /* TSRequestAttachmentId.m in Sources */, 76EB05F018170B33006006FC /* PhoneManager.m in Sources */, E197B60F18BBEC1A00F073E5 /* EncodedAudioFrame.m in Sources */, B6B0966C1A1D25ED008BFAA6 /* TSCall.m in Sources */, - B6B096781A1D25ED008BFAA6 /* TSDeregisterAccountRequest.m in Sources */, 76EB061818170B33006006FC /* AnonymousValueLogger.m in Sources */, - B6B0967C1A1D25ED008BFAA6 /* TSRegisterWithTokenRequest.m in Sources */, 76EB05E618170B33006006FC /* CallController.m in Sources */, FC31962A1A067D8F0094C78E /* MessageComposeTableViewController.m in Sources */, E16E5BEE18AAC40200B7C403 /* EC25KeyAgreementParticipant.m in Sources */, @@ -3850,14 +3865,16 @@ 76EB05AA18170B33006006FC /* SequenceCounter.m in Sources */, 7038632718F70C0700D4A43F /* CryptoTools.m in Sources */, 76EB058C18170B33006006FC /* DnsManager.m in Sources */, + B63AF5CB1A1F757900D01AAD /* TSRegisterPrekeysRequest.m in Sources */, B6B096881A1D25ED008BFAA6 /* TSStorageManager+keyFromIntLong.m in Sources */, 76EB059018170B33006006FC /* IgnoredPacketFailure.m in Sources */, 765052AF182AC9B5008313E1 /* DialerButtonView.m in Sources */, 76EB05D418170B33006006FC /* ZrtpManager.m in Sources */, + B63AF5CD1A1F757900D01AAD /* TSRequest.m in Sources */, 76EB058E18170B33006006FC /* HostNameEndPoint.m in Sources */, - B6B096841A1D25ED008BFAA6 /* TSNetworkManager.m in Sources */, E19167A418A9687800B7A468 /* DH3KKeyAgreementParticipant.m in Sources */, E16E5BF018AAC40200B7C403 /* EvpKeyAgreement.m in Sources */, + B63AF5D11A1F757900D01AAD /* TSUploadAttachment.m in Sources */, FCFD25821A154B3800F4C644 /* CodeVerificationViewController.m in Sources */, FCF72A131A02D27F006BC849 /* ContactDetailTableViewController.m in Sources */, B65EDA1219E1BE6400AAA7CB /* RPAPICall.m in Sources */, @@ -3870,8 +3887,8 @@ E197B62118BBF12700F073E5 /* AppAudioManager.m in Sources */, FC4FA0261A1B9DC600DA100A /* SignalsNavigationController.m in Sources */, 76EB062018170B33006006FC /* BloomFilter.m in Sources */, + B63AF5D31A1F757900D01AAD /* TSSocketManager.m in Sources */, 76EB063818170B33006006FC /* DictionaryUtil.m in Sources */, - B6B0967A1A1D25ED008BFAA6 /* TSRegisterForPushRequest.m in Sources */, 76EB05CE18170B33006006FC /* ZrtpHandshakeResult.m in Sources */, B63761EE19E1FBE8005735D1 /* HttpRequestUtil.m in Sources */, B6B096631A1D25ED008BFAA6 /* TSPreKeyManager.m in Sources */, @@ -3895,7 +3912,6 @@ 76EB060418170B33006006FC /* PhoneNumberDirectoryFilter.m in Sources */, B97CBFA818860EA3008E0DE9 /* CountryCodeViewController.m in Sources */, B6B1013C196D213F007E3930 /* SignalKeyingStorage.m in Sources */, - B6B0967E1A1D25ED008BFAA6 /* TSRequestAttachment.m in Sources */, 76EB059218170B33006006FC /* UnrecognizedRequestFailure.m in Sources */, 76EB05F818170B33006006FC /* CallConnectUtil_Initiator.m in Sources */, B6B096761A1D25ED008BFAA6 /* TSServerMessage.m in Sources */, @@ -3907,26 +3923,26 @@ 76EB064018170B33006006FC /* AnonymousTerminator.m in Sources */, B6B096721A1D25ED008BFAA6 /* TSMessage.m in Sources */, 76EB058818170B33006006FC /* PropertyListPreferences.m in Sources */, - B6B096821A1D25ED008BFAA6 /* TSSubmitMessageRequest.m in Sources */, 76EB05B218170B33006006FC /* DH3KKeyAgreementProtocol.m in Sources */, 76EB060618170B33006006FC /* PhoneNumberDirectoryFilterManager.m in Sources */, B63761EC19E1FBE8005735D1 /* HttpRequest.m in Sources */, B6B096941A1D25ED008BFAA6 /* NSString+escape.m in Sources */, 76EB060818170B33006006FC /* ResponderSessionDescriptor.m in Sources */, B90418E6183E9DD40038554A /* DateUtil.m in Sources */, + B63AF5D21A1F757900D01AAD /* TSNetworkManager.m in Sources */, 76EB05C618170B33006006FC /* HelloAckPacket.m in Sources */, 76EB05E818170B33006006FC /* CallFailedServerMessage.m in Sources */, 76EB05FA18170B33006006FC /* CallConnectUtil_Responder.m in Sources */, 76EB05AE18170B33006006FC /* SrtpStream.m in Sources */, - B6B096831A1D25ED008BFAA6 /* TSUploadAttachment.m in Sources */, B6B096711A1D25ED008BFAA6 /* TSInteraction.mm in Sources */, B6B0966D1A1D25ED008BFAA6 /* TSErrorMessage.m in Sources */, + B63AF5CF1A1F757900D01AAD /* TSRequestAttachmentId.m in Sources */, E197B61318BBEC1A00F073E5 /* DesiredBufferDepthController.m in Sources */, 76EB064818170B33006006FC /* Zid.m in Sources */, B6B096741A1D25ED008BFAA6 /* TSMessagesManager.m in Sources */, B6B096661A1D25ED008BFAA6 /* TSContact.m in Sources */, - B6B0967D1A1D25ED008BFAA6 /* TSRequest.m in Sources */, 76EB05E218170B33006006FC /* SecureEndPoint.m in Sources */, + B63AF5CC1A1F757900D01AAD /* TSRegisterWithTokenRequest.m in Sources */, 76EB05DE18170B33006006FC /* Certificate.m in Sources */, 76EB05B818170B33006006FC /* NegotiationFailed.m in Sources */, B6B096731A1D25ED008BFAA6 /* TSMessagesManager+sendMessages.m in Sources */, diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.h b/Signal/src/textsecure/Messages/TSMessagesManager.h index 2fd86f3c4..fb37493f8 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.h +++ b/Signal/src/textsecure/Messages/TSMessagesManager.h @@ -16,8 +16,7 @@ @property (readonly) YapDatabaseConnection *dbConnection; -- (void)handleBase64MessageSignal:(NSString*)base64EncodedMessage; - +- (void)handleMessageSignal:(NSData*)signalData; - (void)processException:(NSException*)exception outgoingMessage:(TSOutgoingMessage*)message; diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.m b/Signal/src/textsecure/Messages/TSMessagesManager.m index 92b950ec3..387728b61 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.m +++ b/Signal/src/textsecure/Messages/TSMessagesManager.m @@ -55,8 +55,8 @@ return self; } -- (void)handleBase64MessageSignal:(NSString*)base64EncodedMessage{ - NSData *decryptedPayload = [Cryptography decryptAppleMessagePayload:[NSData dataFromBase64String:base64EncodedMessage] withSignalingKey:TSStorageManager.signalingKey]; +- (void)handleMessageSignal:(NSData*)signalData{ + NSData *decryptedPayload = [Cryptography decryptAppleMessagePayload:signalData withSignalingKey:TSStorageManager.signalingKey]; if (!decryptedPayload) { return; diff --git a/Signal/src/textsecure/Network/Requests/TSContactsIntersectionRequest.h b/Signal/src/textsecure/Network/API/Requests/TSContactsIntersectionRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSContactsIntersectionRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSContactsIntersectionRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSContactsIntersectionRequest.m b/Signal/src/textsecure/Network/API/Requests/TSContactsIntersectionRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSContactsIntersectionRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSContactsIntersectionRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSDeregisterAccountRequest.h b/Signal/src/textsecure/Network/API/Requests/TSDeregisterAccountRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSDeregisterAccountRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSDeregisterAccountRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSDeregisterAccountRequest.m b/Signal/src/textsecure/Network/API/Requests/TSDeregisterAccountRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSDeregisterAccountRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSDeregisterAccountRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRecipientPrekeyRequest.h b/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRecipientPrekeyRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSRecipientPrekeyRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRecipientPrekeyRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSRecipientPrekeyRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterForPushRequest.h b/Signal/src/textsecure/Network/API/Requests/TSRegisterForPushRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterForPushRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSRegisterForPushRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterForPushRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRegisterForPushRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterForPushRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSRegisterForPushRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterPrekeysRequest.h b/Signal/src/textsecure/Network/API/Requests/TSRegisterPrekeysRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterPrekeysRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSRegisterPrekeysRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterPrekeysRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRegisterPrekeysRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterPrekeysRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSRegisterPrekeysRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterWithTokenRequest.h b/Signal/src/textsecure/Network/API/Requests/TSRegisterWithTokenRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterWithTokenRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSRegisterWithTokenRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSRegisterWithTokenRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRegisterWithTokenRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRegisterWithTokenRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSRegisterWithTokenRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRequest.h b/Signal/src/textsecure/Network/API/Requests/TSRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSRequest.m b/Signal/src/textsecure/Network/API/Requests/TSRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSRequestAttachment.h b/Signal/src/textsecure/Network/API/Requests/TSRequestAttachment.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequestAttachment.h rename to Signal/src/textsecure/Network/API/Requests/TSRequestAttachment.h diff --git a/Signal/src/textsecure/Network/Requests/TSRequestAttachment.m b/Signal/src/textsecure/Network/API/Requests/TSRequestAttachment.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequestAttachment.m rename to Signal/src/textsecure/Network/API/Requests/TSRequestAttachment.m diff --git a/Signal/src/textsecure/Network/Requests/TSRequestAttachmentId.h b/Signal/src/textsecure/Network/API/Requests/TSRequestAttachmentId.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequestAttachmentId.h rename to Signal/src/textsecure/Network/API/Requests/TSRequestAttachmentId.h diff --git a/Signal/src/textsecure/Network/Requests/TSRequestAttachmentId.m b/Signal/src/textsecure/Network/API/Requests/TSRequestAttachmentId.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSRequestAttachmentId.m rename to Signal/src/textsecure/Network/API/Requests/TSRequestAttachmentId.m diff --git a/Signal/src/textsecure/Network/Requests/TSSubmitMessageRequest.h b/Signal/src/textsecure/Network/API/Requests/TSSubmitMessageRequest.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSSubmitMessageRequest.h rename to Signal/src/textsecure/Network/API/Requests/TSSubmitMessageRequest.h diff --git a/Signal/src/textsecure/Network/Requests/TSSubmitMessageRequest.m b/Signal/src/textsecure/Network/API/Requests/TSSubmitMessageRequest.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSSubmitMessageRequest.m rename to Signal/src/textsecure/Network/API/Requests/TSSubmitMessageRequest.m diff --git a/Signal/src/textsecure/Network/Requests/TSUploadAttachment.h b/Signal/src/textsecure/Network/API/Requests/TSUploadAttachment.h similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSUploadAttachment.h rename to Signal/src/textsecure/Network/API/Requests/TSUploadAttachment.h diff --git a/Signal/src/textsecure/Network/Requests/TSUploadAttachment.m b/Signal/src/textsecure/Network/API/Requests/TSUploadAttachment.m similarity index 100% rename from Signal/src/textsecure/Network/Requests/TSUploadAttachment.m rename to Signal/src/textsecure/Network/API/Requests/TSUploadAttachment.m diff --git a/Signal/src/textsecure/Network/TSNetworkManager.h b/Signal/src/textsecure/Network/API/TSNetworkManager.h similarity index 100% rename from Signal/src/textsecure/Network/TSNetworkManager.h rename to Signal/src/textsecure/Network/API/TSNetworkManager.h diff --git a/Signal/src/textsecure/Network/TSNetworkManager.m b/Signal/src/textsecure/Network/API/TSNetworkManager.m similarity index 82% rename from Signal/src/textsecure/Network/TSNetworkManager.m rename to Signal/src/textsecure/Network/API/TSNetworkManager.m index 449c12549..7cbd2bb75 100644 --- a/Signal/src/textsecure/Network/TSNetworkManager.m +++ b/Signal/src/textsecure/Network/API/TSNetworkManager.m @@ -39,13 +39,13 @@ if (self = [super init]) { NSURLSessionConfiguration *sessionConf = NSURLSessionConfiguration.ephemeralSessionConfiguration; self.operationManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:textSecureServerURL] sessionConfiguration:sessionConf]; - //self.operationManager.responseSerializer = [AFJSONResponseSerializer serializer]; - self.operationManager.securityPolicy.allowInvalidCertificates = YES; - // NSString *certPath = [NSBundle.mainBundle pathForResource:@"whisperReal" ofType:@"cer"]; - // NSData *certData = [NSData dataWithContentsOfFile:certPath]; - // SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); - // self.operationManager.securityPolicy.pinnedCertificates = @[(__bridge_transfer NSData *)SecCertificateCopyData(cert)]; - // self.operationManager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate; + AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; + policy.allowInvalidCertificates = YES; + NSString *certPath = [NSBundle.mainBundle pathForResource:@"whisperReal" ofType:@"cer"]; + NSData *certData = [NSData dataWithContentsOfFile:certPath]; + SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData)); + policy.pinnedCertificates = @[(__bridge_transfer NSData *)SecCertificateCopyData(cert)]; + self.operationManager.securityPolicy = policy; } return self; } diff --git a/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.h b/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.h new file mode 100644 index 000000000..d345d18c9 --- /dev/null +++ b/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.h @@ -0,0 +1,264 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#import "ProtocolBuffers.h" + +// @@protoc_insertion_point(imports) + +@class WebSocketMessage; +@class WebSocketMessageBuilder; +@class WebSocketRequestMessage; +@class WebSocketRequestMessageBuilder; +@class WebSocketResponseMessage; +@class WebSocketResponseMessageBuilder; +#ifndef __has_feature + #define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif // __has_feature + +#ifndef NS_RETURNS_NOT_RETAINED + #if __has_feature(attribute_ns_returns_not_retained) + #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) + #else + #define NS_RETURNS_NOT_RETAINED + #endif +#endif + +typedef enum { + WebSocketMessageTypeUnknown = 0, + WebSocketMessageTypeRequest = 1, + WebSocketMessageTypeResponse = 2, +} WebSocketMessageType; + +BOOL WebSocketMessageTypeIsValidValue(WebSocketMessageType value); + + +@interface SubProtocolRoot : NSObject { +} ++ (PBExtensionRegistry*) extensionRegistry; ++ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; +@end + +@interface WebSocketRequestMessage : PBGeneratedMessage { +@private + BOOL hasId_:1; + BOOL hasVerb_:1; + BOOL hasPath_:1; + BOOL hasBody_:1; + UInt64 id; + NSString* verb; + NSString* path; + NSData* body; +} +- (BOOL) hasVerb; +- (BOOL) hasPath; +- (BOOL) hasBody; +- (BOOL) hasId; +@property (readonly, strong) NSString* verb; +@property (readonly, strong) NSString* path; +@property (readonly, strong) NSData* body; +@property (readonly) UInt64 id; + ++ (WebSocketRequestMessage*) defaultInstance; +- (WebSocketRequestMessage*) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketRequestMessageBuilder*) builder; ++ (WebSocketRequestMessageBuilder*) builder; ++ (WebSocketRequestMessageBuilder*) builderWithPrototype:(WebSocketRequestMessage*) prototype; +- (WebSocketRequestMessageBuilder*) toBuilder; + ++ (WebSocketRequestMessage*) parseFromData:(NSData*) data; ++ (WebSocketRequestMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketRequestMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketRequestMessage* result; +} + +- (WebSocketRequestMessage*) defaultInstance; + +- (WebSocketRequestMessageBuilder*) clear; +- (WebSocketRequestMessageBuilder*) clone; + +- (WebSocketRequestMessage*) build; +- (WebSocketRequestMessage*) buildPartial; + +- (WebSocketRequestMessageBuilder*) mergeFrom:(WebSocketRequestMessage*) other; +- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasVerb; +- (NSString*) verb; +- (WebSocketRequestMessageBuilder*) setVerb:(NSString*) value; +- (WebSocketRequestMessageBuilder*) clearVerb; + +- (BOOL) hasPath; +- (NSString*) path; +- (WebSocketRequestMessageBuilder*) setPath:(NSString*) value; +- (WebSocketRequestMessageBuilder*) clearPath; + +- (BOOL) hasBody; +- (NSData*) body; +- (WebSocketRequestMessageBuilder*) setBody:(NSData*) value; +- (WebSocketRequestMessageBuilder*) clearBody; + +- (BOOL) hasId; +- (UInt64) id; +- (WebSocketRequestMessageBuilder*) setId:(UInt64) value; +- (WebSocketRequestMessageBuilder*) clearId; +@end + +@interface WebSocketResponseMessage : PBGeneratedMessage { +@private + BOOL hasId_:1; + BOOL hasMessage_:1; + BOOL hasBody_:1; + BOOL hasStatus_:1; + UInt64 id; + NSString* message; + NSData* body; + UInt32 status; +} +- (BOOL) hasId; +- (BOOL) hasStatus; +- (BOOL) hasMessage; +- (BOOL) hasBody; +@property (readonly) UInt64 id; +@property (readonly) UInt32 status; +@property (readonly, strong) NSString* message; +@property (readonly, strong) NSData* body; + ++ (WebSocketResponseMessage*) defaultInstance; +- (WebSocketResponseMessage*) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketResponseMessageBuilder*) builder; ++ (WebSocketResponseMessageBuilder*) builder; ++ (WebSocketResponseMessageBuilder*) builderWithPrototype:(WebSocketResponseMessage*) prototype; +- (WebSocketResponseMessageBuilder*) toBuilder; + ++ (WebSocketResponseMessage*) parseFromData:(NSData*) data; ++ (WebSocketResponseMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketResponseMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketResponseMessage* result; +} + +- (WebSocketResponseMessage*) defaultInstance; + +- (WebSocketResponseMessageBuilder*) clear; +- (WebSocketResponseMessageBuilder*) clone; + +- (WebSocketResponseMessage*) build; +- (WebSocketResponseMessage*) buildPartial; + +- (WebSocketResponseMessageBuilder*) mergeFrom:(WebSocketResponseMessage*) other; +- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasId; +- (UInt64) id; +- (WebSocketResponseMessageBuilder*) setId:(UInt64) value; +- (WebSocketResponseMessageBuilder*) clearId; + +- (BOOL) hasStatus; +- (UInt32) status; +- (WebSocketResponseMessageBuilder*) setStatus:(UInt32) value; +- (WebSocketResponseMessageBuilder*) clearStatus; + +- (BOOL) hasMessage; +- (NSString*) message; +- (WebSocketResponseMessageBuilder*) setMessage:(NSString*) value; +- (WebSocketResponseMessageBuilder*) clearMessage; + +- (BOOL) hasBody; +- (NSData*) body; +- (WebSocketResponseMessageBuilder*) setBody:(NSData*) value; +- (WebSocketResponseMessageBuilder*) clearBody; +@end + +@interface WebSocketMessage : PBGeneratedMessage { +@private + BOOL hasRequest_:1; + BOOL hasResponse_:1; + BOOL hasType_:1; + WebSocketRequestMessage* request; + WebSocketResponseMessage* response; + WebSocketMessageType type; +} +- (BOOL) hasType; +- (BOOL) hasRequest; +- (BOOL) hasResponse; +@property (readonly) WebSocketMessageType type; +@property (readonly, strong) WebSocketRequestMessage* request; +@property (readonly, strong) WebSocketResponseMessage* response; + ++ (WebSocketMessage*) defaultInstance; +- (WebSocketMessage*) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketMessageBuilder*) builder; ++ (WebSocketMessageBuilder*) builder; ++ (WebSocketMessageBuilder*) builderWithPrototype:(WebSocketMessage*) prototype; +- (WebSocketMessageBuilder*) toBuilder; + ++ (WebSocketMessage*) parseFromData:(NSData*) data; ++ (WebSocketMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketMessage* result; +} + +- (WebSocketMessage*) defaultInstance; + +- (WebSocketMessageBuilder*) clear; +- (WebSocketMessageBuilder*) clone; + +- (WebSocketMessage*) build; +- (WebSocketMessage*) buildPartial; + +- (WebSocketMessageBuilder*) mergeFrom:(WebSocketMessage*) other; +- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasType; +- (WebSocketMessageType) type; +- (WebSocketMessageBuilder*) setType:(WebSocketMessageType) value; +- (WebSocketMessageBuilder*) clearType; + +- (BOOL) hasRequest; +- (WebSocketRequestMessage*) request; +- (WebSocketMessageBuilder*) setRequest:(WebSocketRequestMessage*) value; +- (WebSocketMessageBuilder*) setRequestBuilder:(WebSocketRequestMessageBuilder*) builderForValue; +- (WebSocketMessageBuilder*) mergeRequest:(WebSocketRequestMessage*) value; +- (WebSocketMessageBuilder*) clearRequest; + +- (BOOL) hasResponse; +- (WebSocketResponseMessage*) response; +- (WebSocketMessageBuilder*) setResponse:(WebSocketResponseMessage*) value; +- (WebSocketMessageBuilder*) setResponseBuilder:(WebSocketResponseMessageBuilder*) builderForValue; +- (WebSocketMessageBuilder*) mergeResponse:(WebSocketResponseMessage*) value; +- (WebSocketMessageBuilder*) clearResponse; +@end + + +// @@protoc_insertion_point(global_scope) diff --git a/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.m b/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.m new file mode 100644 index 000000000..c5d15a9e0 --- /dev/null +++ b/Signal/src/textsecure/Network/WebSockets/SubProtocol.pb.m @@ -0,0 +1,1051 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#import "SubProtocol.pb.h" +// @@protoc_insertion_point(imports) + +@implementation SubProtocolRoot +static PBExtensionRegistry* extensionRegistry = nil; ++ (PBExtensionRegistry*) extensionRegistry { + return extensionRegistry; +} + ++ (void) initialize { + if (self == [SubProtocolRoot class]) { + PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry]; + [self registerAllExtensions:registry]; + extensionRegistry = registry; + } +} ++ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry { +} +@end + +@interface WebSocketRequestMessage () +@property (strong) NSString* verb; +@property (strong) NSString* path; +@property (strong) NSData* body; +@property UInt64 id; +@end + +@implementation WebSocketRequestMessage + +- (BOOL) hasVerb { + return !!hasVerb_; +} +- (void) setHasVerb:(BOOL) value_ { + hasVerb_ = !!value_; +} +@synthesize verb; +- (BOOL) hasPath { + return !!hasPath_; +} +- (void) setHasPath:(BOOL) value_ { + hasPath_ = !!value_; +} +@synthesize path; +- (BOOL) hasBody { + return !!hasBody_; +} +- (void) setHasBody:(BOOL) value_ { + hasBody_ = !!value_; +} +@synthesize body; +- (BOOL) hasId { + return !!hasId_; +} +- (void) setHasId:(BOOL) value_ { + hasId_ = !!value_; +} +@synthesize id; +- (id) init { + if ((self = [super init])) { + self.verb = @""; + self.path = @""; + self.body = [NSData data]; + self.id = 0L; + } + return self; +} +static WebSocketRequestMessage* defaultWebSocketRequestMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketRequestMessage class]) { + defaultWebSocketRequestMessageInstance = [[WebSocketRequestMessage alloc] init]; + } +} ++ (WebSocketRequestMessage*) defaultInstance { + return defaultWebSocketRequestMessageInstance; +} +- (WebSocketRequestMessage*) defaultInstance { + return defaultWebSocketRequestMessageInstance; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasVerb) { + [output writeString:1 value:self.verb]; + } + if (self.hasPath) { + [output writeString:2 value:self.path]; + } + if (self.hasBody) { + [output writeData:3 value:self.body]; + } + if (self.hasId) { + [output writeUInt64:4 value:self.id]; + } + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasVerb) { + size_ += computeStringSize(1, self.verb); + } + if (self.hasPath) { + size_ += computeStringSize(2, self.path); + } + if (self.hasBody) { + size_ += computeDataSize(3, self.body); + } + if (self.hasId) { + size_ += computeUInt64Size(4, self.id); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketRequestMessage*) parseFromData:(NSData*) data { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromData:data] build]; +} ++ (WebSocketRequestMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketRequestMessage*)[[[WebSocketRequestMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketRequestMessageBuilder*) builder { + return [[WebSocketRequestMessageBuilder alloc] init]; +} ++ (WebSocketRequestMessageBuilder*) builderWithPrototype:(WebSocketRequestMessage*) prototype { + return [[WebSocketRequestMessage builder] mergeFrom:prototype]; +} +- (WebSocketRequestMessageBuilder*) builder { + return [WebSocketRequestMessage builder]; +} +- (WebSocketRequestMessageBuilder*) toBuilder { + return [WebSocketRequestMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasVerb) { + [output appendFormat:@"%@%@: %@\n", indent, @"verb", self.verb]; + } + if (self.hasPath) { + [output appendFormat:@"%@%@: %@\n", indent, @"path", self.path]; + } + if (self.hasBody) { + [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; + } + if (self.hasId) { + [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; + } + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketRequestMessage class]]) { + return NO; + } + WebSocketRequestMessage *otherMessage = other; + return + self.hasVerb == otherMessage.hasVerb && + (!self.hasVerb || [self.verb isEqual:otherMessage.verb]) && + self.hasPath == otherMessage.hasPath && + (!self.hasPath || [self.path isEqual:otherMessage.path]) && + self.hasBody == otherMessage.hasBody && + (!self.hasBody || [self.body isEqual:otherMessage.body]) && + self.hasId == otherMessage.hasId && + (!self.hasId || self.id == otherMessage.id) && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasVerb) { + hashCode = hashCode * 31 + [self.verb hash]; + } + if (self.hasPath) { + hashCode = hashCode * 31 + [self.path hash]; + } + if (self.hasBody) { + hashCode = hashCode * 31 + [self.body hash]; + } + if (self.hasId) { + hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; + } + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +@interface WebSocketRequestMessageBuilder() +@property (strong) WebSocketRequestMessage* result; +@end + +@implementation WebSocketRequestMessageBuilder +@synthesize result; +- (id) init { + if ((self = [super init])) { + self.result = [[WebSocketRequestMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return result; +} +- (WebSocketRequestMessageBuilder*) clear { + self.result = [[WebSocketRequestMessage alloc] init]; + return self; +} +- (WebSocketRequestMessageBuilder*) clone { + return [WebSocketRequestMessage builderWithPrototype:result]; +} +- (WebSocketRequestMessage*) defaultInstance { + return [WebSocketRequestMessage defaultInstance]; +} +- (WebSocketRequestMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketRequestMessage*) buildPartial { + WebSocketRequestMessage* returnMe = result; + self.result = nil; + return returnMe; +} +- (WebSocketRequestMessageBuilder*) mergeFrom:(WebSocketRequestMessage*) other { + if (other == [WebSocketRequestMessage defaultInstance]) { + return self; + } + if (other.hasVerb) { + [self setVerb:other.verb]; + } + if (other.hasPath) { + [self setPath:other.path]; + } + if (other.hasBody) { + [self setBody:other.body]; + } + if (other.hasId) { + [self setId:other.id]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 10: { + [self setVerb:[input readString]]; + break; + } + case 18: { + [self setPath:[input readString]]; + break; + } + case 26: { + [self setBody:[input readData]]; + break; + } + case 32: { + [self setId:[input readUInt64]]; + break; + } + } + } +} +- (BOOL) hasVerb { + return result.hasVerb; +} +- (NSString*) verb { + return result.verb; +} +- (WebSocketRequestMessageBuilder*) setVerb:(NSString*) value { + result.hasVerb = YES; + result.verb = value; + return self; +} +- (WebSocketRequestMessageBuilder*) clearVerb { + result.hasVerb = NO; + result.verb = @""; + return self; +} +- (BOOL) hasPath { + return result.hasPath; +} +- (NSString*) path { + return result.path; +} +- (WebSocketRequestMessageBuilder*) setPath:(NSString*) value { + result.hasPath = YES; + result.path = value; + return self; +} +- (WebSocketRequestMessageBuilder*) clearPath { + result.hasPath = NO; + result.path = @""; + return self; +} +- (BOOL) hasBody { + return result.hasBody; +} +- (NSData*) body { + return result.body; +} +- (WebSocketRequestMessageBuilder*) setBody:(NSData*) value { + result.hasBody = YES; + result.body = value; + return self; +} +- (WebSocketRequestMessageBuilder*) clearBody { + result.hasBody = NO; + result.body = [NSData data]; + return self; +} +- (BOOL) hasId { + return result.hasId; +} +- (UInt64) id { + return result.id; +} +- (WebSocketRequestMessageBuilder*) setId:(UInt64) value { + result.hasId = YES; + result.id = value; + return self; +} +- (WebSocketRequestMessageBuilder*) clearId { + result.hasId = NO; + result.id = 0L; + return self; +} +@end + +@interface WebSocketResponseMessage () +@property UInt64 id; +@property UInt32 status; +@property (strong) NSString* message; +@property (strong) NSData* body; +@end + +@implementation WebSocketResponseMessage + +- (BOOL) hasId { + return !!hasId_; +} +- (void) setHasId:(BOOL) value_ { + hasId_ = !!value_; +} +@synthesize id; +- (BOOL) hasStatus { + return !!hasStatus_; +} +- (void) setHasStatus:(BOOL) value_ { + hasStatus_ = !!value_; +} +@synthesize status; +- (BOOL) hasMessage { + return !!hasMessage_; +} +- (void) setHasMessage:(BOOL) value_ { + hasMessage_ = !!value_; +} +@synthesize message; +- (BOOL) hasBody { + return !!hasBody_; +} +- (void) setHasBody:(BOOL) value_ { + hasBody_ = !!value_; +} +@synthesize body; +- (id) init { + if ((self = [super init])) { + self.id = 0L; + self.status = 0; + self.message = @""; + self.body = [NSData data]; + } + return self; +} +static WebSocketResponseMessage* defaultWebSocketResponseMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketResponseMessage class]) { + defaultWebSocketResponseMessageInstance = [[WebSocketResponseMessage alloc] init]; + } +} ++ (WebSocketResponseMessage*) defaultInstance { + return defaultWebSocketResponseMessageInstance; +} +- (WebSocketResponseMessage*) defaultInstance { + return defaultWebSocketResponseMessageInstance; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasId) { + [output writeUInt64:1 value:self.id]; + } + if (self.hasStatus) { + [output writeUInt32:2 value:self.status]; + } + if (self.hasMessage) { + [output writeString:3 value:self.message]; + } + if (self.hasBody) { + [output writeData:4 value:self.body]; + } + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasId) { + size_ += computeUInt64Size(1, self.id); + } + if (self.hasStatus) { + size_ += computeUInt32Size(2, self.status); + } + if (self.hasMessage) { + size_ += computeStringSize(3, self.message); + } + if (self.hasBody) { + size_ += computeDataSize(4, self.body); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketResponseMessage*) parseFromData:(NSData*) data { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromData:data] build]; +} ++ (WebSocketResponseMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResponseMessage*)[[[WebSocketResponseMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResponseMessageBuilder*) builder { + return [[WebSocketResponseMessageBuilder alloc] init]; +} ++ (WebSocketResponseMessageBuilder*) builderWithPrototype:(WebSocketResponseMessage*) prototype { + return [[WebSocketResponseMessage builder] mergeFrom:prototype]; +} +- (WebSocketResponseMessageBuilder*) builder { + return [WebSocketResponseMessage builder]; +} +- (WebSocketResponseMessageBuilder*) toBuilder { + return [WebSocketResponseMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasId) { + [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; + } + if (self.hasStatus) { + [output appendFormat:@"%@%@: %@\n", indent, @"status", [NSNumber numberWithInteger:self.status]]; + } + if (self.hasMessage) { + [output appendFormat:@"%@%@: %@\n", indent, @"message", self.message]; + } + if (self.hasBody) { + [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; + } + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketResponseMessage class]]) { + return NO; + } + WebSocketResponseMessage *otherMessage = other; + return + self.hasId == otherMessage.hasId && + (!self.hasId || self.id == otherMessage.id) && + self.hasStatus == otherMessage.hasStatus && + (!self.hasStatus || self.status == otherMessage.status) && + self.hasMessage == otherMessage.hasMessage && + (!self.hasMessage || [self.message isEqual:otherMessage.message]) && + self.hasBody == otherMessage.hasBody && + (!self.hasBody || [self.body isEqual:otherMessage.body]) && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasId) { + hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; + } + if (self.hasStatus) { + hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.status] hash]; + } + if (self.hasMessage) { + hashCode = hashCode * 31 + [self.message hash]; + } + if (self.hasBody) { + hashCode = hashCode * 31 + [self.body hash]; + } + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +@interface WebSocketResponseMessageBuilder() +@property (strong) WebSocketResponseMessage* result; +@end + +@implementation WebSocketResponseMessageBuilder +@synthesize result; +- (id) init { + if ((self = [super init])) { + self.result = [[WebSocketResponseMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return result; +} +- (WebSocketResponseMessageBuilder*) clear { + self.result = [[WebSocketResponseMessage alloc] init]; + return self; +} +- (WebSocketResponseMessageBuilder*) clone { + return [WebSocketResponseMessage builderWithPrototype:result]; +} +- (WebSocketResponseMessage*) defaultInstance { + return [WebSocketResponseMessage defaultInstance]; +} +- (WebSocketResponseMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketResponseMessage*) buildPartial { + WebSocketResponseMessage* returnMe = result; + self.result = nil; + return returnMe; +} +- (WebSocketResponseMessageBuilder*) mergeFrom:(WebSocketResponseMessage*) other { + if (other == [WebSocketResponseMessage defaultInstance]) { + return self; + } + if (other.hasId) { + [self setId:other.id]; + } + if (other.hasStatus) { + [self setStatus:other.status]; + } + if (other.hasMessage) { + [self setMessage:other.message]; + } + if (other.hasBody) { + [self setBody:other.body]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 8: { + [self setId:[input readUInt64]]; + break; + } + case 16: { + [self setStatus:[input readUInt32]]; + break; + } + case 26: { + [self setMessage:[input readString]]; + break; + } + case 34: { + [self setBody:[input readData]]; + break; + } + } + } +} +- (BOOL) hasId { + return result.hasId; +} +- (UInt64) id { + return result.id; +} +- (WebSocketResponseMessageBuilder*) setId:(UInt64) value { + result.hasId = YES; + result.id = value; + return self; +} +- (WebSocketResponseMessageBuilder*) clearId { + result.hasId = NO; + result.id = 0L; + return self; +} +- (BOOL) hasStatus { + return result.hasStatus; +} +- (UInt32) status { + return result.status; +} +- (WebSocketResponseMessageBuilder*) setStatus:(UInt32) value { + result.hasStatus = YES; + result.status = value; + return self; +} +- (WebSocketResponseMessageBuilder*) clearStatus { + result.hasStatus = NO; + result.status = 0; + return self; +} +- (BOOL) hasMessage { + return result.hasMessage; +} +- (NSString*) message { + return result.message; +} +- (WebSocketResponseMessageBuilder*) setMessage:(NSString*) value { + result.hasMessage = YES; + result.message = value; + return self; +} +- (WebSocketResponseMessageBuilder*) clearMessage { + result.hasMessage = NO; + result.message = @""; + return self; +} +- (BOOL) hasBody { + return result.hasBody; +} +- (NSData*) body { + return result.body; +} +- (WebSocketResponseMessageBuilder*) setBody:(NSData*) value { + result.hasBody = YES; + result.body = value; + return self; +} +- (WebSocketResponseMessageBuilder*) clearBody { + result.hasBody = NO; + result.body = [NSData data]; + return self; +} +@end + +@interface WebSocketMessage () +@property WebSocketMessageType type; +@property (strong) WebSocketRequestMessage* request; +@property (strong) WebSocketResponseMessage* response; +@end + +@implementation WebSocketMessage + +- (BOOL) hasType { + return !!hasType_; +} +- (void) setHasType:(BOOL) value_ { + hasType_ = !!value_; +} +@synthesize type; +- (BOOL) hasRequest { + return !!hasRequest_; +} +- (void) setHasRequest:(BOOL) value_ { + hasRequest_ = !!value_; +} +@synthesize request; +- (BOOL) hasResponse { + return !!hasResponse_; +} +- (void) setHasResponse:(BOOL) value_ { + hasResponse_ = !!value_; +} +@synthesize response; +- (id) init { + if ((self = [super init])) { + self.type = WebSocketMessageTypeUnknown; + self.request = [WebSocketRequestMessage defaultInstance]; + self.response = [WebSocketResponseMessage defaultInstance]; + } + return self; +} +static WebSocketMessage* defaultWebSocketMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketMessage class]) { + defaultWebSocketMessageInstance = [[WebSocketMessage alloc] init]; + } +} ++ (WebSocketMessage*) defaultInstance { + return defaultWebSocketMessageInstance; +} +- (WebSocketMessage*) defaultInstance { + return defaultWebSocketMessageInstance; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasType) { + [output writeEnum:1 value:self.type]; + } + if (self.hasRequest) { + [output writeMessage:2 value:self.request]; + } + if (self.hasResponse) { + [output writeMessage:3 value:self.response]; + } + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasType) { + size_ += computeEnumSize(1, self.type); + } + if (self.hasRequest) { + size_ += computeMessageSize(2, self.request); + } + if (self.hasResponse) { + size_ += computeMessageSize(3, self.response); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketMessage*) parseFromData:(NSData*) data { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromData:data] build]; +} ++ (WebSocketMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketMessage*)[[[WebSocketMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketMessageBuilder*) builder { + return [[WebSocketMessageBuilder alloc] init]; +} ++ (WebSocketMessageBuilder*) builderWithPrototype:(WebSocketMessage*) prototype { + return [[WebSocketMessage builder] mergeFrom:prototype]; +} +- (WebSocketMessageBuilder*) builder { + return [WebSocketMessage builder]; +} +- (WebSocketMessageBuilder*) toBuilder { + return [WebSocketMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasType) { + [output appendFormat:@"%@%@: %d\n", indent, @"type", self.type]; + } + if (self.hasRequest) { + [output appendFormat:@"%@%@ {\n", indent, @"request"]; + [self.request writeDescriptionTo:output + withIndent:[NSString stringWithFormat:@"%@ ", indent]]; + [output appendFormat:@"%@}\n", indent]; + } + if (self.hasResponse) { + [output appendFormat:@"%@%@ {\n", indent, @"response"]; + [self.response writeDescriptionTo:output + withIndent:[NSString stringWithFormat:@"%@ ", indent]]; + [output appendFormat:@"%@}\n", indent]; + } + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketMessage class]]) { + return NO; + } + WebSocketMessage *otherMessage = other; + return + self.hasType == otherMessage.hasType && + (!self.hasType || self.type == otherMessage.type) && + self.hasRequest == otherMessage.hasRequest && + (!self.hasRequest || [self.request isEqual:otherMessage.request]) && + self.hasResponse == otherMessage.hasResponse && + (!self.hasResponse || [self.response isEqual:otherMessage.response]) && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasType) { + hashCode = hashCode * 31 + self.type; + } + if (self.hasRequest) { + hashCode = hashCode * 31 + [self.request hash]; + } + if (self.hasResponse) { + hashCode = hashCode * 31 + [self.response hash]; + } + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +BOOL WebSocketMessageTypeIsValidValue(WebSocketMessageType value) { + switch (value) { + case WebSocketMessageTypeUnknown: + case WebSocketMessageTypeRequest: + case WebSocketMessageTypeResponse: + return YES; + default: + return NO; + } +} +@interface WebSocketMessageBuilder() +@property (strong) WebSocketMessage* result; +@end + +@implementation WebSocketMessageBuilder +@synthesize result; +- (id) init { + if ((self = [super init])) { + self.result = [[WebSocketMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return result; +} +- (WebSocketMessageBuilder*) clear { + self.result = [[WebSocketMessage alloc] init]; + return self; +} +- (WebSocketMessageBuilder*) clone { + return [WebSocketMessage builderWithPrototype:result]; +} +- (WebSocketMessage*) defaultInstance { + return [WebSocketMessage defaultInstance]; +} +- (WebSocketMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketMessage*) buildPartial { + WebSocketMessage* returnMe = result; + self.result = nil; + return returnMe; +} +- (WebSocketMessageBuilder*) mergeFrom:(WebSocketMessage*) other { + if (other == [WebSocketMessage defaultInstance]) { + return self; + } + if (other.hasType) { + [self setType:other.type]; + } + if (other.hasRequest) { + [self mergeRequest:other.request]; + } + if (other.hasResponse) { + [self mergeResponse:other.response]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 8: { + WebSocketMessageType value = (WebSocketMessageType)[input readEnum]; + if (WebSocketMessageTypeIsValidValue(value)) { + [self setType:value]; + } else { + [unknownFields mergeVarintField:1 value:value]; + } + break; + } + case 18: { + WebSocketRequestMessageBuilder* subBuilder = [WebSocketRequestMessage builder]; + if (self.hasRequest) { + [subBuilder mergeFrom:self.request]; + } + [input readMessage:subBuilder extensionRegistry:extensionRegistry]; + [self setRequest:[subBuilder buildPartial]]; + break; + } + case 26: { + WebSocketResponseMessageBuilder* subBuilder = [WebSocketResponseMessage builder]; + if (self.hasResponse) { + [subBuilder mergeFrom:self.response]; + } + [input readMessage:subBuilder extensionRegistry:extensionRegistry]; + [self setResponse:[subBuilder buildPartial]]; + break; + } + } + } +} +- (BOOL) hasType { + return result.hasType; +} +- (WebSocketMessageType) type { + return result.type; +} +- (WebSocketMessageBuilder*) setType:(WebSocketMessageType) value { + result.hasType = YES; + result.type = value; + return self; +} +- (WebSocketMessageBuilder*) clearType { + result.hasType = NO; + result.type = WebSocketMessageTypeUnknown; + return self; +} +- (BOOL) hasRequest { + return result.hasRequest; +} +- (WebSocketRequestMessage*) request { + return result.request; +} +- (WebSocketMessageBuilder*) setRequest:(WebSocketRequestMessage*) value { + result.hasRequest = YES; + result.request = value; + return self; +} +- (WebSocketMessageBuilder*) setRequestBuilder:(WebSocketRequestMessageBuilder*) builderForValue { + return [self setRequest:[builderForValue build]]; +} +- (WebSocketMessageBuilder*) mergeRequest:(WebSocketRequestMessage*) value { + if (result.hasRequest && + result.request != [WebSocketRequestMessage defaultInstance]) { + result.request = + [[[WebSocketRequestMessage builderWithPrototype:result.request] mergeFrom:value] buildPartial]; + } else { + result.request = value; + } + result.hasRequest = YES; + return self; +} +- (WebSocketMessageBuilder*) clearRequest { + result.hasRequest = NO; + result.request = [WebSocketRequestMessage defaultInstance]; + return self; +} +- (BOOL) hasResponse { + return result.hasResponse; +} +- (WebSocketResponseMessage*) response { + return result.response; +} +- (WebSocketMessageBuilder*) setResponse:(WebSocketResponseMessage*) value { + result.hasResponse = YES; + result.response = value; + return self; +} +- (WebSocketMessageBuilder*) setResponseBuilder:(WebSocketResponseMessageBuilder*) builderForValue { + return [self setResponse:[builderForValue build]]; +} +- (WebSocketMessageBuilder*) mergeResponse:(WebSocketResponseMessage*) value { + if (result.hasResponse && + result.response != [WebSocketResponseMessage defaultInstance]) { + result.response = + [[[WebSocketResponseMessage builderWithPrototype:result.response] mergeFrom:value] buildPartial]; + } else { + result.response = value; + } + result.hasResponse = YES; + return self; +} +- (WebSocketMessageBuilder*) clearResponse { + result.hasResponse = NO; + result.response = [WebSocketResponseMessage defaultInstance]; + return self; +} +@end + + +// @@protoc_insertion_point(global_scope) diff --git a/Signal/src/textsecure/Network/WebSockets/SubProtocol.proto b/Signal/src/textsecure/Network/WebSockets/SubProtocol.proto new file mode 100644 index 000000000..0fc5ce75d --- /dev/null +++ b/Signal/src/textsecure/Network/WebSockets/SubProtocol.proto @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2014 Open WhisperSystems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package textsecure; + +option java_package = "org.whispersystems.websocket.messages.protobuf"; + +message WebSocketRequestMessage { + optional string verb = 1; + optional string path = 2; + optional bytes body = 3; + optional uint64 id = 4; +} + +message WebSocketResponseMessage { + optional uint64 id = 1; + optional uint32 status = 2; + optional string message = 3; + optional bytes body = 4; +} + +message WebSocketMessage { + enum Type { + UNKNOWN = 0; + REQUEST = 1; + RESPONSE = 2; + } + + optional Type type = 1; + optional WebSocketRequestMessage request = 2; + optional WebSocketResponseMessage response = 3; +} \ No newline at end of file diff --git a/Signal/src/textsecure/Network/TSSocketManager.h b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.h similarity index 100% rename from Signal/src/textsecure/Network/TSSocketManager.h rename to Signal/src/textsecure/Network/WebSockets/TSSocketManager.h diff --git a/Signal/src/textsecure/Network/TSSocketManager.m b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m similarity index 73% rename from Signal/src/textsecure/Network/TSSocketManager.m rename to Signal/src/textsecure/Network/WebSockets/TSSocketManager.m index 9548ad180..feb79d1bd 100644 --- a/Signal/src/textsecure/Network/TSSocketManager.m +++ b/Signal/src/textsecure/Network/WebSockets/TSSocketManager.m @@ -6,6 +6,8 @@ // Copyright (c) 2014 Open Whisper Systems. All rights reserved. // +#import "SubProtocol.pb.h" + #import "TSConstants.h" #import "TSAccountManager.h" #import "TSMessagesManager.h" @@ -49,7 +51,7 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; #pragma mark - Manage Socket -+ (void)becomeActive{ ++ (void)becomeActive { TSSocketManager *sharedInstance = [self sharedManager]; SRWebSocket *socket =[sharedInstance websocket]; @@ -87,46 +89,57 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; #pragma mark - Delegate methods -- (void) webSocketDidOpen:(SRWebSocket *)webSocket{ - NSLog(@"WebSocket was sucessfully opened"); +- (void) webSocketDidOpen:(SRWebSocket *)webSocket { self.timer = [NSTimer scheduledTimerWithTimeInterval:kWebSocketHeartBeat target:self selector:@selector(webSocketHeartBeat) userInfo:nil repeats:YES]; self.status = kSocketStatusOpen; } -- (void) webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error{ - NSLog(@"Error connecting to socket %@", error); +- (void) webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error { + DDLogError(@"Error connecting to socket %@", error); [self.timer invalidate]; self.status = kSocketStatusClosed; } -- (void) webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{ - NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; - NSError *error = nil; +- (void) webSocket:(SRWebSocket *)webSocket didReceiveMessage:(NSData*)data { + WebSocketMessage *wsMessage = [WebSocketMessage parseFromData:data]; - NSDictionary *serializedMessage = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; - NSString *base64message = [serializedMessage objectForKey:@"message"]; - - - if (!base64message || error) { - return; + if (wsMessage.type == WebSocketMessageTypeRequest) { + [self processWebSocketRequestMessage:wsMessage.request]; + } else if (wsMessage.type == WebSocketMessageTypeResponse){ + [self processWebSocketResponseMessage:wsMessage.response]; + } else{ + DDLogWarn(@"Got a WebSocketMessage of unknown type"); } - - [[TSMessagesManager sharedManager] handleBase64MessageSignal:base64message]; - - - NSString *ackedId = [serializedMessage objectForKey:@"id"]; - [self.websocket send:[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:@{@"type":@"1", @"id":ackedId} - options:0 error:nil] - encoding:NSUTF8StringEncoding]]; } -- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{ +- (void)processWebSocketRequestMessage:(WebSocketRequestMessage*)message { + DDLogInfo(@"Got message with verb: %@ and path: %@", message.verb, message.path); + + if ([message.path isEqualToString:@"/api/v1/message"] && [message.verb isEqualToString:@"PUT"]){ + [[TSMessagesManager sharedManager] handleMessageSignal:message.body]; + } else{ + DDLogWarn(@"Unsupported WebSocket Request"); + } +} + +- (void)processWebSocketResponseMessage:(WebSocketResponseMessage*)message { + DDLogWarn(@"Client should not receive WebSocket Respond messages"); +} + +- (void)sendWebSocketMessageAcknowledgement:(NSString*)messageId { + WebSocketResponseMessageBuilder *message = [WebSocketResponseMessage builder]; + [message setStatus:200]; + [message setMessage:messageId]; + [self.websocket send:message.build.data]; +} + +- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean { DDLogVerbose(@"WebSocket did close"); [self.timer invalidate]; self.status = kSocketStatusClosed; } -- (void)webSocketHeartBeat{ +- (void)webSocketHeartBeat { DDLogVerbose(@"WebSocket sent ping"); [self.websocket sendPing:nil]; } @@ -152,7 +165,6 @@ NSString * const SocketConnectingNotification = @"SocketConnectingNotification"; break; default: break; - } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];