Compare commits

..

202 Commits

Author SHA1 Message Date
Chris Ballinger 38d6abba3e 5.0.4 (171) 2021-08-06 21:52:24 -07:00
Chris Ballinger 77bfacdf9b Reduce annoyance 2021-08-06 21:52:24 -07:00
Chris Ballinger f8b7360e46 Show donation in onboarding flow 2021-08-06 21:52:24 -07:00
Chris Ballinger c81e2d1a9b Update dependencies and fix warnings 2021-08-06 21:52:24 -07:00
Chris Ballinger 6a5d4b32b7
Merge pull request #1226 from stigger/master
Update IOCipher dependency
2021-01-18 10:43:51 -08:00
Vyacheslav Karpukhin 267d5f75fd Update IOCipher dependency 2021-01-17 19:43:26 +01:00
Chris Ballinger 4e170ec200 Disable Apple Silicon for Catalyst 2021-01-14 23:16:44 -08:00
Chris Ballinger 1cf0633f78 5.0.3 (169) 2021-01-14 23:05:16 -08:00
Chris Ballinger 5ba021e086 Fix Catalyst donations 2021-01-14 22:17:53 -08:00
Chris Ballinger 8b0ec50ca2
Merge pull request #1215 from ChatSecure/xcode-12
Xcode 12 Updates
2021-01-14 22:11:40 -08:00
Chris Ballinger 1a2894f7a2 Updates 2021-01-14 22:08:47 -08:00
Chris Ballinger 837a26f020 Update dependencies 2021-01-14 21:51:07 -08:00
Chris Ballinger f8e26d1de0 Fixing issues with Xcode 12 2020-09-24 20:54:27 -07:00
Chris Ballinger 21babb5bf2 5.0.2 (167) 2020-04-13 21:08:18 -07:00
Chris Ballinger 0a3d7ed076 Hide QR code button on unsupported devices 2020-04-13 21:01:18 -07:00
Chris Ballinger 5efdc773fb Refactor for YapDatabase 4.0 2020-04-13 20:15:34 -07:00
Chris Ballinger aa6c3bb331
Merge pull request #1189 from stigger/storage_management
Add a possibility to delete downloaded media to free up storage
2020-04-13 20:15:12 -07:00
Chris Ballinger 429346694e 5.0.2 (166) 2020-04-07 22:51:26 -07:00
Chris Ballinger 36f45beeae
Merge pull request #1199 from ChatSecure/remove-server-list
Remove outdated server list for new signups
2020-04-07 22:46:41 -07:00
Chris Ballinger 28d24ab3f7 Fix xib warnings 2020-04-07 22:20:55 -07:00
Chris Ballinger b3b54532bd Remove outdated server list for new signups 2020-04-07 22:18:01 -07:00
Chris Ballinger 1faaed22fb 5.0.2 (165) 2020-04-05 19:05:29 -07:00
Chris Ballinger c0bbe36657 Resolve dark mode issue when creating groups 2020-04-05 19:04:52 -07:00
Chris Ballinger 3beb5a81f4 5.0.2 (164) 2020-03-30 20:03:17 -07:00
Chris Ballinger 9bf31885c2 Hide QR code button when its unavailable 2020-03-30 20:01:50 -07:00
Chris Ballinger 0f516da163
Merge pull request #1197 from ChatSecure/5.0.2-updates
5.0.2 Updates
2020-03-26 21:12:35 -07:00
Chris Ballinger 1e91f06399 5.0.2 (163) 2020-03-26 21:12:17 -07:00
Chris Ballinger 3133c449f1 JTSImageViewController does not work on iOS 13 2020-03-26 20:32:13 -07:00
Chris Ballinger 996ebf6196 Fix tests 2020-03-26 20:27:18 -07:00
Chris Ballinger d1302494ec Update license plist 2020-03-26 20:15:11 -07:00
Chris Ballinger 33bfa93cfa Update translations 2020-03-26 20:12:28 -07:00
Chris Ballinger d23013b79e Fix file transfer 2020-03-26 20:05:45 -07:00
Chris Ballinger 7a9ede89d2 5.0.2 (162) 2020-03-25 17:47:14 -07:00
Chris Ballinger bce96bf49d Remove CPAProxy 2020-03-25 17:31:30 -07:00
Chris Ballinger 0649e80251 5.0.2 (161) 2020-03-24 18:24:50 -07:00
Chris Ballinger ba1cc83658 Update dependencies 2020-03-24 18:10:16 -07:00
Chris Ballinger 666c6dc20a Use CryptoKit on iOS 13 for 12-byte IVs 2020-02-28 15:13:35 -08:00
Chris Ballinger 0a54c68422 OTRKit nil checks 2020-02-28 15:12:17 -08:00
Chris Ballinger f34fc46f45 ServerCapabilityInfo to struct 2020-02-28 14:31:27 -08:00
Chris Ballinger a4ec91e072 Fix CPAProxy.bundle crash 2020-02-28 14:15:01 -08:00
Chris Ballinger a626fbff56 Updates for YapDatabase 4.0 2020-02-28 13:02:01 -08:00
Chris Ballinger 4067e2632c Update CocoaAsyncSocket and CocoaLumberjack 2020-02-28 12:06:28 -08:00
Vyacheslav Karpukhin 930d31161f Add a possibility to delete downloaded media to free up storage 2020-02-26 01:40:20 +01:00
Chris Ballinger 03b6a74cda 5.0.1 2020-02-16 10:05:04 -08:00
Chris Ballinger cf72f4d07e
Merge pull request #1180 from ChatSecure/12-byte-iv
Accept 12-byte IV for OMEMO media
2020-02-16 09:58:00 -08:00
Chris Ballinger 74c0600635 Accept 12-byte IV for OMEMO media 2020-02-16 09:43:57 -08:00
Chris Ballinger dd9da3b892
Merge pull request #1155 from ChatSecure/xcode-11
Xcode 11 updates
2020-02-15 21:54:16 -08:00
Chris Ballinger f7fdb660d8 Use xcconfigs 2020-01-26 12:42:53 -08:00
Chris Ballinger 73363caa4f Fix tests 2020-01-26 12:31:40 -08:00
Chris Ballinger 9ef61e71a6 Fix IAP on Mac 2020-01-26 11:43:53 -08:00
Chris Ballinger 76aa26762b Use xcconfigs for ITS export compliance 2020-01-26 10:28:44 -08:00
Chris Ballinger c083034b95 Add macOS export compliance code 2019-12-03 19:25:26 -08:00
Chris Ballinger dd7001510a Import target conditionals 2019-11-05 21:16:08 -08:00
Chris Ballinger c86273529c
Merge pull request #1160 from ChatSecure/sponsors
Add sponsorship information
2019-11-04 20:46:35 -08:00
Chris Ballinger fdefa22acb Add sponsorship information 2019-11-04 20:45:09 -08:00
Chris Ballinger 3f45347224 Fix popover crash 2019-11-03 22:51:56 -08:00
Chris Ballinger 4abaa4dfa8 Fix compilation on iOS 12 2019-11-03 14:13:50 -08:00
Chris Ballinger 048af83c98 Fix warning 2019-11-03 14:13:37 -08:00
Chris Ballinger ed2dfbe57e Fixing background fetch on iOS 13 2019-11-03 14:01:30 -08:00
Chris Ballinger 6d1f27da12 Remove OTRResources bundle to resolve FB7425571 2019-11-03 13:41:05 -08:00
Chris Ballinger 26c51acbdb Disable Tor 2019-11-03 13:40:45 -08:00
Chris Ballinger f8a253db40 Fix dark mode issue 2019-11-03 11:57:34 -08:00
Chris Ballinger 8de2fc9fa7 Fixing catalyst resource bundle issues 2019-11-03 11:18:46 -08:00
Chris Ballinger d258ea4394 Support dark mode 2019-11-03 10:50:32 -08:00
Chris Ballinger d004e98105 Fix local file server on catalyst 2019-11-03 10:25:31 -08:00
Chris Ballinger 8b4ade78d8 Do not resign first responder for return key 2019-11-03 10:25:16 -08:00
Chris Ballinger 319c415223 Enable send with return key 2019-11-03 09:41:11 -08:00
Chris Ballinger 2ddf1f9160 Remove pods with bundles 2019-11-03 09:14:07 -08:00
Chris Ballinger 96ec845544 Fix group avatar issue 2019-11-03 08:39:04 -08:00
Chris Ballinger 863a5e6d77 Fix info plist 2019-11-02 16:49:21 -07:00
Chris Ballinger 325c805ed3 Handling catalyst deprecations 2019-11-02 13:10:22 -07:00
Chris Ballinger 5f65e6e23f Fix Xcode warnings 2019-11-02 11:21:30 -07:00
Chris Ballinger 26768fc9c7 Use InfoPlist.h for conditionals 2019-10-27 17:08:29 -07:00
Chris Ballinger 74c24aac83 Working on catalyst 2019-10-27 14:27:05 -07:00
Chris Ballinger af961267d2 Bump XMPPFramework 2019-10-27 13:06:47 -07:00
Chris Ballinger 6efaf45833 Support NSSecureCoding 2019-10-27 12:46:05 -07:00
Chris Ballinger 118178cc80 Fix crashing test 2019-10-27 12:30:47 -07:00
Chris Ballinger 724a36f991 Fix duplicate category definition warnings 2019-10-27 11:55:59 -07:00
Chris Ballinger 6e52bc480f Fixing warnings 2019-10-27 10:17:37 -07:00
Chris Ballinger cbd8c9306d Bump XMPPFramework 2019-10-26 22:49:54 -07:00
Chris Ballinger a79a2b53fc Deployment target 12.0 2019-10-26 18:25:26 -07:00
Chris Ballinger a8da9da0db Update Travis 2019-10-26 18:11:25 -07:00
Chris Ballinger 3d2b34094a Catalyst fixes 2019-10-26 14:53:24 -07:00
Chris Ballinger 6a99c49fa6 Fix remaining catalyst issues 2019-10-26 14:01:41 -07:00
Chris Ballinger 76c169e126 Fix code signing and ZXingObjC for Catalyst 2019-10-26 13:48:16 -07:00
Chris Ballinger bd149de5b8 Remove default NSFileProtectionComplete entitlement 2019-10-20 21:35:52 -07:00
Chris Ballinger b392cbb797 Building for Catalyst 2019-10-20 21:06:43 -07:00
Chris Ballinger 96950e8175 Fix archiving 2019-10-20 20:43:58 -07:00
Chris Ballinger c7a5c576d0 Remove prebuilt xcframeworks 2019-10-20 20:33:03 -07:00
Chris Ballinger fd9a05d3e0 turns out xcframeworks dont work for Release builds 2019-10-20 14:56:32 -07:00
Chris Ballinger 99e626574c CPAProxy and OTRKit integrated as xcframeworks 2019-10-20 14:02:58 -07:00
Chris Ballinger a2947a8070 OTRKit.framework 2019-10-20 10:01:48 -07:00
Chris Ballinger 78be32c876 Add back ChatSecureCore framework 2019-10-20 09:13:42 -07:00
Chris Ballinger 56e9dffe60 Fix storyboard issue 2019-10-17 21:07:45 -07:00
Chris Ballinger 6422cffac7 Fix issues accessing values off of main thread 2019-10-17 21:04:20 -07:00
Chris Ballinger 6f14a6f6e8 Fix more dark mode issues 2019-10-17 20:59:07 -07:00
Chris Ballinger 9013c4c93a Clean up Podfile 2019-10-17 20:46:10 -07:00
Chris Ballinger cf85f01595 Move resources 2019-10-17 20:42:51 -07:00
Chris Ballinger a29d0126a0 Fix launch screen 2019-10-17 20:26:00 -07:00
Chris Ballinger f955d4b27b Dependency updates 2019-10-17 20:16:21 -07:00
Chris Ballinger 4d7c0ae354 Fix dark mode issues on donation screen 2019-10-01 22:24:40 -07:00
Chris Ballinger 1389ef1899 Xcode 11 updates 2019-10-01 21:48:41 -07:00
Chris Ballinger a2a33a53d1 Fix issue where Mantle could not be installed 2019-08-11 19:35:07 -07:00
Chris Ballinger 04e1386cfc 4.3.9 (143) 2019-07-31 21:37:45 -07:00
Chris Ballinger f49adfe781
Merge pull request #1139 from ChatSecure/bugfix/issue-1135
Fix issue where profile fingerprint trust values cannot be updated
2019-07-31 21:14:44 -07:00
Chris Ballinger a49ab2b145 Add XLFormOptionObject conformance to OMEMODevice and OTRFingerprint. Fixes #1135 2019-07-31 21:12:02 -07:00
Chris Ballinger 4630c535bc Merge branch 'master' of github.com:ChatSecure/ChatSecure-iOS 2019-07-31 19:57:48 -07:00
Chris Ballinger 78f9be11d4 Update Deliverfile 2019-07-31 19:57:37 -07:00
Chris Ballinger cf1813f427
Merge pull request #1136 from sicherist/master
Remove Zom
2019-07-20 13:27:22 -07:00
sicherist fc868522c8
Remove Zom
Zom switched from XMPP to Matrix (https://github.com/bascht/omemo-top/pull/181)
2019-07-20 22:11:33 +02:00
Chris Ballinger e565d9b1b5 4.3.8 (142) 2019-07-14 21:22:35 -07:00
Chris Ballinger 7216b7626e
Merge pull request #1134 from ChatSecure/dep-updates
Update to SQLCipher 4.0, Tor 0.4.0.5
2019-07-14 21:16:21 -07:00
Chris Ballinger 8e0fd84296 Fix tests 2019-07-14 10:53:34 -07:00
Chris Ballinger 3990c5f311 Fix travis 2019-07-14 00:08:47 -07:00
Chris Ballinger 354bc2a2e3 Update commit 2019-07-14 00:05:45 -07:00
Chris Ballinger aca21e0a8d Fix travis 2019-07-14 00:03:10 -07:00
Chris Ballinger 8ec1630aa3 Tor 0.4.0.5 2019-07-13 23:56:20 -07:00
Chris Ballinger 5f3e057d04 Remove Navajo 2019-07-13 13:26:42 -07:00
Chris Ballinger 1a9a26b319 Fix libsqlfs SQLCipher cipher compat version 2019-07-13 13:16:15 -07:00
Chris Ballinger 0a01e5263b Working on SQLCipher 4.0 compat 2019-07-13 12:43:06 -07:00
Chris Ballinger f44bf57295
Merge pull request #1120 from ChatSecure/chatsecurecore-podspec
ChatSecureCore Podspec
2019-07-13 10:52:58 -07:00
Chris Ballinger 37edbfceb7 Remove Carthage 2019-05-26 20:21:10 -07:00
Chris Ballinger 56ea40ea45 Fix compilation issue with Mantle and tests 2019-05-26 19:05:55 -07:00
Chris Ballinger 71384d7e5b Update zxing 2019-05-26 17:34:29 -07:00
Chris Ballinger 0f80cb8d7a Use static linking 2019-05-26 17:28:16 -07:00
Chris Ballinger faa2449d54 Add podspecs 2019-05-26 17:14:32 -07:00
Chris Ballinger dedf40e525 Metadata updates 2019-04-22 19:18:20 -07:00
Chris Ballinger 105b7fd7f4 Version 4.3.7 (139) 2019-04-13 12:53:44 -07:00
Chris Ballinger 04016992d6 Update translations 2019-04-13 12:43:01 -07:00
Chris Ballinger 46eca1c306 Dependency updates 2019-04-13 12:41:47 -07:00
Chris Ballinger 55cfdd967f
Merge pull request #1101 from mimi89999/anon-gc
Show occupant nickname in occupant view for anonymous conferences
2019-04-13 10:51:41 -07:00
mimi89999 224abd0ade Show occupant nickname in occupant view for anonymous conferences
Fixes #1028
2019-03-29 11:01:48 +01:00
Chris Ballinger 5a8e7abdc9
Merge pull request #1098 from ChatSecure/xcode_10.2
Xcode 10.2
2019-03-26 21:01:42 -07:00
Chris Ballinger 81d58267ba Workaround for LicensePlist not working on Travis 2019-03-26 20:46:58 -07:00
Chris Ballinger 8fd3c03a24 Fix Travis 2019-03-26 20:11:47 -07:00
Chris Ballinger b5665ab4c9 Use CocoaPods 1.6.1 2019-03-26 20:04:44 -07:00
Chris Ballinger 32c0422208 Update Pods 2019-03-26 19:33:12 -07:00
Chris Ballinger 7f09c5a66a Update for Xcode 10.2 and Swift 5 2019-03-26 18:40:59 -07:00
Chris Ballinger f0a8a94458
Merge pull request #1080 from mimi89999/cleanup
Remove unused OTRXMPPStream override of XMPPStream
2018-12-11 21:12:18 -08:00
mimi89999 9873d46db9 Remove unused OTRXMPPStream override of XMPPStream 2018-12-11 18:42:05 +01:00
Chris Ballinger 1d0f6d73c3 4.3.6 (138) 2018-12-09 21:30:30 -08:00
Chris Ballinger 1d96d2a632 Update translations 2018-12-09 21:29:45 -08:00
Chris Ballinger 2a84c436ef Update release notes 2018-12-09 21:29:45 -08:00
Chris Ballinger e46b17e24b Use myJID domain for cert pinning dialog. Fixes #1079 2018-12-09 21:29:45 -08:00
Chris Ballinger 2137a954d3
Merge pull request #1076 from ChatSecure/4.3.6-beta
4.3.6 Beta [WIP]
2018-12-08 14:24:44 -08:00
Chris Ballinger 25bf44ad5f 4.3.6 (137) 2018-12-08 11:51:04 -08:00
Chris Ballinger 1ac62fb97e Fix libsqlfs regression 2018-12-08 11:45:53 -08:00
Chris Ballinger 1e07079f63 Revert SQLCipher 4.0.0 update 2018-12-06 20:09:01 -08:00
Chris Ballinger fa1dc66625 Attempted fix for disappearing chat view #950 2018-12-06 19:49:59 -08:00
Chris Ballinger 0ad1a00097 Fix memory leak 2018-12-06 19:38:51 -08:00
Chris Ballinger 3bd126bed4 Merge branch 'master' of https://github.com/mimi89999/ChatSecure-iOS into 4.3.6-beta 2018-12-06 19:31:34 -08:00
Chris Ballinger 420799ec37 Update license plist 2018-12-06 19:24:21 -08:00
Chris Ballinger 1b84c2f442 Deliverfile 2018-12-06 19:17:14 -08:00
Chris Ballinger 036d4dff27 Fix crash in JSQ #817 #977 #1038 2018-12-06 19:10:44 -08:00
Chris Ballinger 82932fc6c0 Swift 4.2 Updates 2018-12-06 19:03:33 -08:00
Chris Ballinger b5ef5d29bb
Merge pull request #1073 from mimi89999/encrypted-ct-fix
Fix displaying of encrypted attachments
2018-12-06 18:03:03 -08:00
mimi89999 50c695a4cf Fix displaying of encrypted attachments
If the file is encrypted, the server might not know its mime type. If that's the case, it will set contenttype to application/octet-stream. If the file is encrypted and this mime type is advertised by the server, we must guess the mime type from the extension
2018-12-06 19:49:43 +01:00
mimi89999 507b14a8e5 Use a different security policy for validating certificates against CAs
The policy that was used for showing information about certificate validity didn't validate domains

Closes #1071
2018-12-04 18:54:46 +01:00
Chris Ballinger 848d7e97d7 Version 4.3.5 (135) 2018-09-29 20:59:38 -07:00
Chris Ballinger 6871f068d7 Merge remote-tracking branch 'origin/master' 2018-09-29 20:54:18 -07:00
Chris Ballinger 663b45c94d
Merge pull request #1059 from zom/xep0363fix
Handle media upload headers
2018-09-29 20:53:33 -07:00
Chris Ballinger 3fcf5e9b96 Update dependencies 2018-09-29 20:52:25 -07:00
N-Pex c00882f8ed Handle media upload headers 2018-09-20 13:12:07 +02:00
Chris Ballinger 1169253384 Improve padding 2018-07-22 12:31:35 -07:00
Chris Ballinger a872058ad9 Fix room notification switch 2018-07-22 12:20:47 -07:00
Chris Ballinger bab6eecd92 Add terms and privacy links 2018-07-21 15:34:27 -07:00
Chris Ballinger 50a410e075 4.3.4 (133) 2018-07-21 14:38:04 -07:00
Chris Ballinger 01c67659ab Add required IAP text 2018-07-21 14:29:09 -07:00
Chris Ballinger 682e865f94 Crash fixing 2018-07-21 13:29:54 -07:00
Chris Ballinger bb937cc9df Update metadata 2018-07-18 18:49:49 -07:00
Chris Ballinger 39b8c84141 4.3.4 (132) 2018-07-18 18:35:03 -07:00
Chris Ballinger c2a7f288c2 v4.3.3 (131) 2018-07-14 09:05:23 -07:00
Chris Ballinger 8edfcf19f7 Update metadata 2018-07-12 19:47:15 -07:00
Chris Ballinger d600157be3 Version 4.3.2 (130) 2018-07-12 19:38:14 -07:00
Chris Ballinger d5dbd7b6a3 Bump CPAProxy 2018-07-12 19:23:05 -07:00
Chris Ballinger 67e8c5ccef Attempt to workaround crash #1034 2018-07-12 19:20:43 -07:00
Chris Ballinger 7593e05956 Update screenshots 2018-07-12 19:20:02 -07:00
Chris Ballinger 22dd6a9663 fix test 2018-07-08 15:57:02 -07:00
Chris Ballinger e3d6db60dd 4.3.1 (129) 2018-07-08 15:28:58 -07:00
Chris Ballinger c30e66ee2b Fix static analyzer warnings 2018-07-08 15:24:46 -07:00
Chris Ballinger 3abf10ec57 Fix duplicated MAM messages 2018-07-08 14:50:42 -07:00
Chris Ballinger a9d0494822 Fix Travis 2018-07-08 14:23:21 -07:00
Chris Ballinger 5607c31330 Update licenses 2018-07-08 14:21:07 -07:00
Chris Ballinger ffd471116e Update translations 2018-07-08 14:06:46 -07:00
Chris Ballinger 2a296936b7 Xcode 9.4 2018-07-08 14:04:49 -07:00
Chris Ballinger de3b071fe1
Merge pull request #1025 from zom/zom_dev
Don't expire last key, group notification fix
2018-07-08 13:48:04 -07:00
N-Pex 29f7340535 Use cocoapods 1.5.3 2018-06-29 15:38:49 +02:00
N-Pex 186c0d16d2 Revert "Add branding flag for default group to plaintext or "best""
This reverts commit fd52a70c79.
2018-06-28 16:26:46 +02:00
N-Pex 4c08fb8793 Don't expire last seen trusted device 2018-06-28 16:26:46 +02:00
N-Pex 9b6f56b02e Improved grouping of notifications
This is to avoid notification spamming on connection errors when we try to reconnect repeatedly.
2018-06-28 16:26:46 +02:00
Chris Ballinger 183f01d0eb SignalProtocolC 2.3.2 & SignalProtocolObjC 1.1.0 2018-06-04 23:21:46 -07:00
Chris Ballinger d79187b0fe Remove usage of SWIFT_ENUM 2018-06-04 22:02:57 -07:00
Chris Ballinger 20fe9bda81 Update AFNetworking, Mantle, HTMLReader 2018-06-04 21:38:42 -07:00
Chris Ballinger 2ddff10546 XMPPFramework 4.0 2018-06-04 21:25:30 -07:00
Chris Ballinger 01309217c1
Merge pull request #1002 from zom/omemo_group_receipts
Add receipt request
2018-04-30 08:14:03 -07:00
N-Pex 667bff6c84 Add receipt request 2018-04-30 16:54:48 +02:00
Chris Ballinger 8f617ff655
Merge pull request #1001 from ChatSecure/warning-fixes
Fix Xcode 9.3 warnings
2018-04-29 23:34:32 -07:00
Chris Ballinger 983f292329 Remove deprecated overrides 2018-04-29 20:40:50 -07:00
Chris Ballinger b50b797edf Fix implicit self retain warning 2018-04-29 20:36:48 -07:00
Chris Ballinger a77fe47606 Remove unused OTRBuddyViewController 2018-04-29 20:34:00 -07:00
Chris Ballinger dae156b6bb Swift 4.1 compactMap 2018-04-29 20:32:26 -07:00
Chris Ballinger 77eabee9a7 Remove unused UIActionSheet category 2018-04-29 20:32:15 -07:00
553 changed files with 6935 additions and 8271 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
github: chrisballinger

5
.gitignore vendored
View File

@ -1,3 +1,4 @@
.env
.DS_Store
build
*.mode1v3
@ -14,3 +15,7 @@ Carthage/
com.mono0926.LicensePlist.Output/
Secrets.plist
Preview.html
fastlane/report.xml
fastlane/test_output/
.ruby-version

9
.gitmodules vendored
View File

@ -31,3 +31,12 @@
[submodule "Submodules/LumberjackConsole"]
path = Submodules/LumberjackConsole
url = git@github.com:ChatSecure/LumberjackConsole.git
[submodule "Submodules/YapDatabase"]
path = Submodules/YapDatabase
url = git@github.com:ChatSecure/YapDatabase.git
[submodule "Submodules/YapTaskQueue"]
path = Submodules/YapTaskQueue
url = git@github.com:ChatSecure/YapTaskQueue.git
[submodule "Submodules/libsqlfs"]
path = Submodules/libsqlfs
url = git@github.com:ChatSecure/libsqlfs.git

View File

@ -1,4 +1,4 @@
osx_image: xcode9.3
osx_image: xcode12
language: objective-c
# Handle git submodules yourself
@ -9,9 +9,8 @@ git:
# Use sed to replace the SSH URL with the public URL, then initialize submodules
before_install:
# Fix Travis xcodebuild exited with 65 https://github.com/travis-ci/travis-ci/issues/6675#issuecomment-257964767
- export IOS_SIMULATOR_UDID=`instruments -s devices | grep -m 1 "iPhone 8 (11" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
- export IOS_SIMULATOR_UDID=`instruments -s devices | grep -m 1 "iPhone 8 (14" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
- echo $IOS_SIMULATOR_UDID
- open -a "simulator" --args -CurrentDeviceUDID $IOS_SIMULATOR_UDID
- bundle install # We need a pre-release CocoaPods version
- sed -i -e 's/git@github.com:/git:\/\/github.com\//' .gitmodules
- sed -i -e 's/git@github.com:/git:\/\/github.com\//' Podfile
@ -22,12 +21,8 @@ install:
- curl -L https://github.com/ChatSecure/ChatSecure-iOS-Precompiled-Dependencies/archive/master.zip -o ChatSecure-iOS-Precompiled-Dependencies.zip
- unzip -q ChatSecure-iOS-Precompiled-Dependencies.zip
- mv ChatSecure-iOS-Precompiled-Dependencies-master ChatSecure-iOS-Precompiled-Dependencies
- mkdir -p ./Carthage/Build/iOS/
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/Carthage-iOS.zip -d ./Carthage/Build
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/CPAProxyDependencies.zip -d ./Submodules/CPAProxy/
- mv ./Submodules/CPAProxy/CPAProxyDependencies ./Submodules/CPAProxy/CPAProxyDependencies-iOS
- cp -r ./Submodules/CPAProxy/CPAProxyDependencies-iOS ./Submodules/CPAProxy/CPAProxyDependencies-macOS
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/OTRKitDependencies-iOS.zip -d ./Submodules/OTRKit/
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/OTRKitDependencies.zip -d ./Submodules/OTRKit/
- unzip -q ./ChatSecure-iOS-Precompiled-Dependencies/Pods.zip
before_script:

View File

@ -1,16 +0,0 @@
github "ChatSecure/Mantle" "2.1.0_headerfix"
github "nolanw/HTMLReader" "1d0dda3"
github "AFNetworking/AFNetworking" ~> 3.1
github "TheLevelUp/ZXingObjC" ~> 3.2.2
github "soffes/SAMKeychain" ~> 1.5
github "jdg/MBProgressHUD" ~> 1.1
github "TTTAttributedLabel/TTTAttributedLabel" ~> 2.0
github "PureLayout/PureLayout" ~> 3.0
github "facebook/KVOController" ~> 1.2
github "xmartlabs/XLForm" ~> 4.0.0
github "mattt/FormatterKit" ~> 1.8
### Using CocoaPods due to Swift 3->4 issues ###
# github "Cocoanetics/Kvitto" ~> 1.0
# github "Cocoanetics/DTFoundation" ~> 1.7
# github "Alamofire/Alamofire" ~> 4.4

View File

@ -1,11 +0,0 @@
github "AFNetworking/AFNetworking" "3.2.0"
github "ChatSecure/Mantle" "4c1a09cb0c0811956cd35262340e42b940971cbb"
github "PureLayout/PureLayout" "v3.0.2"
github "TTTAttributedLabel/TTTAttributedLabel" "2.0.0"
github "TheLevelUp/ZXingObjC" "3.2.2"
github "facebook/KVOController" "v1.2.0"
github "jdg/MBProgressHUD" "1.1.0"
github "mattt/FormatterKit" "1.8.2"
github "nolanw/HTMLReader" "1d0dda3849ff719fa15a0c4cac0118c70ef2217c"
github "soffes/SAMKeychain" "v1.5.3"
github "xmartlabs/XLForm" "4.0.0"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "NO"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
BuildableName = "ChatSecureTests.xctest"
BlueprintName = "ChatSecureTests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "macOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
disableMainThreadChecker = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
BuildableName = "ChatSecureTests.xctest"
BlueprintName = "ChatSecureTests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6365CEFB1E2453F6009E213F"
BuildableName = "ChatSecureUITests.xctest"
BlueprintName = "ChatSecureUITests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "macOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "OS_ACTIVITY_MODE"
value = "disable"
isEnabled = "NO">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "macOS_Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "macOS_Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "macOS_Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -37,10 +37,20 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
disableMainThreadChecker = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
@ -53,17 +63,7 @@
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D9227C321BA7952100B5E1D0"
BuildableName = "ChatSecureCoreTests.xctest"
BlueprintName = "ChatSecureCoreTests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
skipped = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6365CEFB1E2453F6009E213F"
@ -73,20 +73,9 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -109,14 +98,12 @@
<EnvironmentVariable
key = "OS_ACTIVITY_MODE"
value = "disable"
isEnabled = "YES">
isEnabled = "NO">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
@ -133,10 +120,10 @@
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
buildConfiguration = "iOS_Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -10,11 +10,11 @@
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "NO"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
BlueprintIdentifier = "D9C527FF235CB55C002B213A"
BuildableName = "ChatSecureCore.framework"
BlueprintName = "ChatSecureCore"
ReferencedContainer = "container:ChatSecure.xcodeproj">
@ -23,26 +23,15 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
BuildableName = "ChatSecureCore.framework"
BlueprintName = "ChatSecureCore"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -51,20 +40,9 @@
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
BuildableName = "ChatSecureCore.framework"
BlueprintName = "ChatSecureCore"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
@ -72,7 +50,7 @@
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D9227C291BA7952100B5E1D0"
BlueprintIdentifier = "D9C527FF235CB55C002B213A"
BuildableName = "ChatSecureCore.framework"
BlueprintName = "ChatSecureCore"
ReferencedContainer = "container:ChatSecure.xcodeproj">
@ -80,10 +58,10 @@
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
buildConfiguration = "iOS_Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -23,10 +23,19 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
BuildableName = "ChatSecureTests.xctest"
BlueprintName = "ChatSecureTests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
@ -39,20 +48,9 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AFB21A169D54009F3E6C"
BuildableName = "ChatSecureTests.xctest"
BlueprintName = "ChatSecureTests"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "iOS_Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -77,11 +75,9 @@
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
@ -97,10 +93,10 @@
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
buildConfiguration = "iOS_Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
buildConfiguration = "iOS_Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -10,7 +10,8 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
disableMainThreadChecker = "YES">
<Testables>
<TestableReference
skipped = "NO">
@ -23,22 +24,12 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6396AF991A169D54009F3E6C"
BuildableName = "ChatSecure.app"
BlueprintName = "ChatSecure"
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
disableMainThreadChecker = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
@ -55,8 +46,6 @@
ReferencedContainer = "container:ChatSecure.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -8,7 +8,17 @@
<array>
<string>applinks:chatsecure.org</string>
</array>
<key>com.apple.developer.default-data-protection</key>
<string>NSFileProtectionComplete</string>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.personal-information.photos-library</key>
<true/>
</dict>
</plist>

View File

@ -1,15 +0,0 @@
//
// UIActionSheet+ChatSecure.h
// ChatSecure
//
// Created by David Chiles on 10/24/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
@import UIKit;
@interface UIActionSheet (ChatSecure)
- (void)otr_presentInView:(UIView *)view;
@end

View File

@ -1,23 +0,0 @@
//
// UIActionSheet+ChatSecure.m
// ChatSecure
//
// Created by David Chiles on 10/24/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "UIActionSheet+ChatSecure.h"
#import "OTRAppDelegate.h"
@implementation UIActionSheet (ChatSecure)
- (void)otr_presentInView:(UIView *)view
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[self showInView:view];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self showInView:[OTRAppDelegate appDelegate].window];
}
}
@end

View File

@ -1,21 +0,0 @@
//
// OTROAuthRefresher.h
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
@import Foundation;
@class GTMOAuth2Authentication;
@class FBAccessTokenData;
@class OTROAuthXMPPAccount;
typedef void(^OTROAuthCompletionBlock)(id token,NSError *);
@interface OTROAuthRefresher : NSObject
+ (void)refreshAccount:(OTROAuthXMPPAccount *)account completion:(OTROAuthCompletionBlock)completionBlock;
@end

View File

@ -1,41 +0,0 @@
//
// OTROAuthRefresher.m
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTROAuthRefresher.h"
#import "GTMOAuth2Authentication.h"
#import "OTRSecrets.h"
#import "OTRConstants.h"
#import "OTROAuthXMPPAccount.h"
@implementation OTROAuthRefresher
+ (void)refreshGoogleToken:(GTMOAuth2Authentication *)authToken completion:(OTROAuthCompletionBlock)completionBlock
{
[authToken authorizeRequest:nil completionHandler:^(NSError *error) {
if (completionBlock) {
if (!error) {
completionBlock(authToken,nil);
}
else {
completionBlock(nil,error);
}
}
}];
}
+ (void)refreshAccount:(OTROAuthXMPPAccount *)account completion:(OTROAuthCompletionBlock)completionBlock
{
if (account.accountType == OTRAccountTypeGoogleTalk) {
[self refreshGoogleToken:[account accountSpecificToken] completion:completionBlock];
}
}
@end

View File

@ -1,144 +0,0 @@
//
// OTRProtocolManager.swift
// ChatSecureCore
//
// Created by Chris Ballinger on 1/22/18.
// Copyright © 2018 Chris Ballinger. All rights reserved.
//
import Foundation
import OTRAssets
@objc
public class OTRProtocolManager: NSObject {
private var protocols: [String:OTRProtocol] = [:]
private var xmppManagers: [XMPPManager] {
return protocols.values.compactMap { $0 as? XMPPManager }
}
@objc
public func existsProtocolForAccount(_ account: OTRAccount) -> Bool {
return existsProtocol(for: account)
}
public func existsProtocol(for account: OTRAccount) -> Bool {
return protocols[account.uniqueId] != nil
}
@objc
public func protocolForAccount(_ account: OTRAccount) -> OTRProtocol? {
return protocols[account.uniqueId]
}
public func `protocol`(for account: OTRAccount) -> OTRProtocol? {
return protocolForAccount(account)
}
@objc
public func xmppManagerForAccount(_ account: OTRAccount) -> XMPPManager? {
return xmppManager(for: account)
}
public func xmppManager(for account: OTRAccount) -> XMPPManager? {
return protocolForAccount(account) as? XMPPManager
}
@objc
public func removeProtocolForAccount(_ account: OTRAccount) {
removeProtocolForAccount(account)
}
public func removeProtocol(for account: OTRAccount) {
protocols[account.uniqueId] = nil
}
@objc
public func isAccountConnected(_ account: OTRAccount) -> Bool {
return xmppManager(for: account)?.loginStatus == .authenticated
}
@objc
public func loginAccount(_ account: OTRAccount) {
loginAccount(account, userInitiated: false)
}
@objc
public func loginAccount(_ account: OTRAccount, userInitiated: Bool) {
xmppManager(for: account)?.connectUserInitiated(userInitiated)
}
@objc
public func loginAccounts(_ accounts: [OTRAccount]) {
accounts.forEach {
self.loginAccount($0)
}
}
@objc
public func goAwayForAllAccounts() {
xmppManagers.forEach {
$0.goAway()
}
}
@objc
public func sendMessage(_ message: OTROutgoingMessage) {
send(message)
}
/// This should probably be moved elsewhere
public func send(_ message: OTROutgoingMessage) {
let _account = OTRDatabaseManager.shared.connections?.read.fetch {
message.buddy(with: $0)?.account(with: $0)
}
guard let account = _account else { return }
xmppManager(for: account)?.send(message)
}
@objc
public func disconnectAllAccounts() {
disconnectAllAccountsSocketOnly(false, timeout: 0, completionBlock: nil)
}
@objc
public func disconnectAllAccountsSocketOnly(_ socketOnly: Bool,
timeout: TimeInterval,
completionBlock: (()->Void)?) {
let group = DispatchGroup()
var observers: [NSKeyValueObservation] = []
xmppManagers.forEach { (xmpp) in
guard xmpp.loginStatus != .disconnected else {
return
}
group.enter()
let observer = xmpp.observe(\.loginStatus, changeHandler: { (xmpp, change) in
if xmpp.loginStatus == .disconnected {
group.leave()
}
})
observers.append(observer)
xmpp.disconnectSocketOnly(socketOnly)
}
group.notify(queue: .main) {
observers.removeAll()
completionBlock?()
}
}
}
public extension OTRProtocolManager {
#if DEBUG
/// when OTRBranding.pushStagingAPIURL is nil (during tests) a valid value must be supplied for the integration tests to pass
private static let pushApiEndpoint: URL = OTRBranding.pushStagingAPIURL ?? URL(string: "http://localhost")!
#else
private static let pushApiEndpoint: URL = OTRBranding.pushAPIURL
#endif
@objc public static let encryptionManager = OTREncryptionManager()
@objc public static let shared = OTRProtocolManager()
@objc public static func sharedInstance() -> OTRProtocolManager {
return OTRProtocolManager.shared
}
@objc public static let pushController = PushController(baseURL: OTRProtocolManager.pushApiEndpoint, sessionConfiguration: URLSessionConfiguration.ephemeral)
}

View File

@ -1,48 +0,0 @@
//
// OTRPurchaseController.h
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
#import "OTRStoreTableViewCell.h"
#define kOTRPurchaseControllerProductUpdateNotification @"kOTRPurchaseControllerProductUpdateNotification"
@protocol OTRPurchaseControllerDelegate <NSObject>
@required
- (void) productsUpdated:(NSArray*)products;
@end
@interface OTRPurchaseController : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@property (nonatomic, weak) id<OTRPurchaseControllerDelegate> delegate;
@property (nonatomic, strong) NSArray *products;
- (void) requestProducts;
- (void) buyProduct:(SKProduct *)product;
- (void) restorePurchases;
- (BOOL) isProductIdentifierPurchased:(NSString*)productIdentifier;
- (void) setProductIdentifier:(NSString*)productIdentifier purchased:(BOOL)purchased;
+ (OTRPurchaseController*) sharedInstance;
@end

View File

@ -1,176 +0,0 @@
//
// OTRPurchaseController.m
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import "OTRPurchaseController.h"
#import "AFNetworking.h"
#import "Strings.h"
#import "OTRPushAPIClient.h"
#define REQUEST_PRODUCT_IDENTIFIERS @"request_product_identifiers"
#define PRODUCT_IDENTIFIERS_KEY @"identifiers"
#define PRODUCTS_KEY @"products"
@implementation OTRPurchaseController
@synthesize products;
- (void) dealloc {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- (id) init {
if (self = [super init]) {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
+ (OTRPurchaseController*)sharedInstance
{
static dispatch_once_t once;
static OTRPurchaseController *sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[OTRPurchaseController alloc] init];
});
return sharedInstance;
}
- (void) requestProducts {
if (products) {
[self.delegate productsUpdated:products];
} else {
[self requestProductIdentifiers];
}
}
- (void) requestProductIdentifiers {
// Code to request product identifiers here
NSURL *requestURL = [NSURL URLWithString:REQUEST_PRODUCT_IDENTIFIERS relativeToURL:[OTRPushAPIClient sharedClient].baseURL];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:requestURL.absoluteString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
[self fetchProductsWithIdentifiers:[NSSet setWithArray:[responseObject objectForKey:PRODUCT_IDENTIFIERS_KEY]]];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error loading product identifiers: %@%@", [error localizedDescription], [error userInfo]);
}];
}
- (void) fetchProductsWithIdentifiers:(NSSet*)identifiers {
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers];
request.delegate = self;
[request start];
}
- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
if ([response.invalidProductIdentifiers count] > 0) {
NSLog(@"Invalid products identifiers: %@", [response.invalidProductIdentifiers description]);
}
self.products = response.products;
[self.delegate productsUpdated:products];
}
- (void) buyProduct:(SKProduct *)product {
if ([SKPaymentQueue canMakePayments]) {
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ERROR_STRING message:PAYMENTS_SETUP_ERROR_STRING delegate:nil cancelButtonTitle:nil otherButtonTitles:OK_STRING, nil];
[alert show];
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
NSLog(@"Transaction: %@", transaction.transactionIdentifier);
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
NSLog(@"Transaction purchased");
//[[OTRPushController sharedInstance] registerWithReceipt:transaction.transactionReceipt resetAccount:NO];
[self setProductIdentifier:transaction.payment.productIdentifier purchased:YES];
[self sendProductUpdateNotification];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
break;
case SKPaymentTransactionStateFailed:
NSLog(@"Transaction failed");
[self sendProductUpdateNotification];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Original transaction restored: %@", transaction.originalTransaction.transactionIdentifier);
//[[OTRPushController sharedInstance] registerWithReceipt:transaction.transactionReceipt resetAccount:YES];
[self setProductIdentifier:transaction.payment.productIdentifier purchased:YES];
[self sendProductUpdateNotification];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
NSLog(@"Transaction restored");
break;
case SKPaymentTransactionStatePurchasing:
NSLog(@"Purchasing transaction... ");
break;
default:
break;
}
}
}
- (void) sendProductUpdateNotification {
[[NSNotificationCenter defaultCenter] postNotificationName:kOTRPurchaseControllerProductUpdateNotification object:self];
}
- (BOOL) isProductIdentifierPurchased:(NSString*)productIdentifier {
NSMutableDictionary *productsDictionary = [self productsDictionary];
NSNumber *productValue = [productsDictionary objectForKey:productIdentifier];
if (!productValue) {
return NO;
}
return [productValue boolValue];
}
- (NSMutableDictionary*) productsDictionary {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *productDictionary = [NSMutableDictionary dictionaryWithDictionary:[defaults objectForKey:PRODUCTS_KEY]];
if (!productDictionary) {
productDictionary = [NSMutableDictionary dictionary];
}
return productDictionary;
}
- (void) saveProductsDictionary:(NSMutableDictionary*)productsDictionary {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:productsDictionary forKey:PRODUCTS_KEY];
BOOL success = [defaults synchronize];
if (!success) {
NSLog(@"Product preferences not saved to disk!");
}
}
- (void) setProductIdentifier:(NSString*)productIdentifier purchased:(BOOL)purchased {
NSMutableDictionary *productsDictionary = [self productsDictionary];
[productsDictionary setObject:[NSNumber numberWithBool:purchased] forKey:productIdentifier];
[self saveProductsDictionary:productsDictionary];
}
- (void) restorePurchases {
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
@end

View File

@ -1,20 +0,0 @@
//
// OTRPushTLVHandler.h
// ChatSecure
//
// Created by David Chiles on 9/28/15.
// Copyright © 2015 Chris Ballinger. All rights reserved.
//
@import Foundation;
@import OTRKit;
#import "OTRPushTLVHandlerProtocols.h"
@interface OTRPushTLVHandler : NSObject <OTRTLVHandler, OTRPushTLVHandlerProtocol>
@property (nonatomic, weak, readwrite) id<OTRPushTLVHandlerDelegate> delegate;
@property (nonatomic, weak, readwrite) OTRKit *otrKit;
- (instancetype)initWithOTRKit:(OTRKit *)otrKit delegate:(id<OTRPushTLVHandlerDelegate>)delegate;
@end

View File

@ -1,43 +0,0 @@
//
// OTRPushTLVHandler.m
// ChatSecure
//
// Created by David Chiles on 9/28/15.
// Copyright © 2015 Chris Ballinger. All rights reserved.
//
#import "OTRPushTLVHandler.h"
@import OTRKit;
static const uint16_t OTRPushTLVType = 0x01A4;
@implementation OTRPushTLVHandler
- (instancetype)initWithOTRKit:(OTRKit *)otrKit delegate:(id<OTRPushTLVHandlerDelegate>)delegate;
{
if (self = [self init]) {
self.otrKit = otrKit;
self.delegate = delegate;
[self.otrKit registerTLVHandler:self];
}
return self;
}
- (NSArray *)handledTLVTypes
{
return @[@(OTRPushTLVType)];
}
- (void)receiveTLV:(OTRTLV *)tlv username:(NSString *)username accountName:(NSString *)accountName protocol:(NSString *)protocol fingerprint:(OTRFingerprint *)fingerprint tag:(id)tag
{
[self.delegate receivePushData:tlv.data username:username accountName:accountName protocolString:protocol fingerprint:fingerprint];
}
- (void)sendPushData:(NSData *)data username:(NSString *)username accountName:(NSString *)accountName protocol:(NSString *)protocol
{
OTRTLV *tlv = [[OTRTLV alloc] initWithType:OTRPushTLVType data:data];
[self.otrKit encodeMessage:nil tlvs:@[tlv] username:username accountName:accountName protocol:protocol tag:nil];
}
@end

View File

@ -1,28 +0,0 @@
//
// OTRPushTLVHandlerDelegateProtocol.h
// ChatSecure
//
// Created by David Chiles on 9/28/15.
// Copyright © 2015 Chris Ballinger. All rights reserved.
//
@class OTRFingerprint;
@protocol OTRPushTLVHandlerDelegate
@required
- (void)receivePushData:(NSData *)tlvData
username:(NSString *)username
accountName:(NSString *)accountName
protocolString:(NSString *)protocolString
fingerprint:(OTRFingerprint *)fingerprint;
@end
@protocol OTRPushTLVHandlerProtocol
@required
- (void)sendPushData:(NSData *)data
username:(NSString *)username
accountName:(NSString *)accountName
protocol:(NSString *)protocol;
@end

View File

@ -1,55 +0,0 @@
//
// OTROTRSignalEncryptionHelper.swift
// ChatSecure
//
// Created by David Chiles on 10/3/16.
// Copyright © 2016 Chris Ballinger. All rights reserved.
//
import UIKit
import OTRKit
class OTRSignalEncryptionHelper {
/**
Encrypt data with IV and key using aes-128-gcm
- parameter data: The data to be encrypted.
- parameter key The symmetric key
- parameter iv The initialization vector
returns: The encrypted data
*/
class func encryptData(_ data:Data, key:Data, iv:Data) throws -> OTRCryptoData? {
return try OTRCryptoUtility.encryptAESGCMData(data, key: key, iv: iv)
}
/**
Decrypt data with IV and key using aes-128-gcm
- parameter data: The data to be decrypted.
- parameter key The symmetric key
- parameter iv The initialization vector
returns: The Decrypted data
*/
class func decryptData(_ data:Data, key:Data, iv:Data, authTag:Data) throws -> Data? {
let cryptoData = OTRCryptoData(data: data, authTag: authTag)
return try OTRCryptoUtility.decryptAESGCMData(cryptoData, key: key, iv: iv)
}
/** Generates random data of length 16 bytes */
fileprivate class func randomDataOfBlockLength() -> Data? {
return OTRPasswordGenerator.randomData(withLength: 16)
}
/** Generates random key of length 16 bytes*/
class func generateSymmetricKey() -> Data? {
return self.randomDataOfBlockLength()
}
/** Generates random iv of length 16 bytes */
class func generateIV() -> Data? {
return self.randomDataOfBlockLength()
}
}

View File

@ -1,49 +0,0 @@
//
// OTRTorManager.m
// ChatSecure
//
// Created by Christopher Ballinger on 10/3/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTRTorManager.h"
@import CPAProxy;
@implementation OTRTorManager
- (instancetype) init {
if (self = [super init]) {
// Get resource paths for the torrc and geoip files from the main bundle
NSBundle *cpaProxyFrameworkBundle = [NSBundle bundleForClass:[CPAProxyManager class]];
NSURL *cpaProxyBundleURL = [cpaProxyFrameworkBundle URLForResource:@"CPAProxy" withExtension:@"bundle"];
NSBundle *cpaProxyBundle = [[NSBundle alloc] initWithURL:cpaProxyBundleURL];
NSParameterAssert(cpaProxyBundle != nil);
NSString *torrcPath = [[NSBundle mainBundle] pathForResource:@"torrc" ofType:nil]; // use custom torrc
NSString *geoipPath = [cpaProxyBundle pathForResource:@"geoip" ofType:nil];
NSString *dataDirectory = [[[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"com.ChatSecure.Tor"] path];
// Initialize a CPAProxyManager
CPAConfiguration *configuration = [CPAConfiguration configurationWithTorrcPath:torrcPath geoipPath:geoipPath torDataDirectoryPath:dataDirectory];
configuration.isolateDestinationAddress = YES;
configuration.isolateDestinationPort = YES;
self.torManager = [CPAProxyManager proxyWithConfiguration:configuration];
}
return self;
}
#pragma - mark Singleton Methodd
+ (instancetype)sharedInstance
{
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
@end

View File

@ -1,90 +0,0 @@
//
// PushOTRListener.swift
// ChatSecure
//
// Created by David Chiles on 9/29/15.
// Copyright © 2015 Chris Ballinger. All rights reserved.
//
import Foundation
import ChatSecure_Push_iOS
/**
* Listen for changes from EncryptionManager for changes in state and when detetced going encrypted
* ensures push token is transfered
*/
class PushOTRListener: NSObject {
let queue = OperationQueue()
var notification:NSObjectProtocol?
weak var storage:PushStorageProtocol?
weak var pushController:PushController?
weak var tlvHandler:OTRPushTLVHandlerProtocol?
init (storage:PushStorageProtocol?, pushController:PushController?, tlvHandler:OTRPushTLVHandlerProtocol?) {
self.storage = storage
self.pushController = pushController
self.tlvHandler = tlvHandler
super.init()
self.startObserving()
}
func startObserving() {
self.notification = NotificationCenter.default.addObserver(forName: NSNotification.Name.OTRMessageStateDidChange, object: nil, queue: self.queue) {[weak self] (notification) -> Void in
self?.handleNotification(notification)
}
}
func handleNotification(_ notification:Notification) {
guard let buddy = notification.object as? OTRBuddy else {
return
}
if let dictionary = notification.userInfo as? [String:AnyObject] {
let number = dictionary[OTRMessageStateKey] as? NSNumber
if let enumValue = number?.uintValue, enumValue == OTREncryptionMessageState.encrypted.rawValue {
if let account = self.storage?.account(buddy.accountUniqueId) {
//Everytime we're starting a new OTR Session we resend a new fresh push token either from the server or the cache
self.pushController?.getNewPushToken(buddy.uniqueId, completion: {[weak self] (t, error) -> Void in
if let token = t, let pushToken = token.pushToken {
do {
try self?.sendOffToken(pushToken, buddyUsername: buddy.username, accountUsername: account.username, protocol: account.protocolTypeString())
} catch let error as NSError {
if (error.code == PushError.misingExpiresDate.rawValue) {
self?.pushController?.storage.removeToken(token)
//Somehow we got a token without a expires date. We need to clear the database of these tokens and try again
guard let timeBuffer = self?.pushController?.timeBufffer else {
return
}
self?.pushController?.storage.removeAllOurExpiredUnusedTokens(timeBuffer, completion: { (count) in
//try again
self?.handleNotification(notification)
})
}
}
}
})
}
}
}
}
func sendOffToken(_ token:Token, buddyUsername:String, accountUsername:String, protocol:String) throws -> Void {
if let url = self.pushController?.apiClient.messageEndpont().absoluteString {
if let data = try PushSerializer.serialize([token], APIEndpoint: url) {
self.tlvHandler?.sendPush(data, username: buddyUsername, accountName:accountUsername , protocol: `protocol`)
}
}
}
deinit {
if let token = self.notification {
NotificationCenter.default.removeObserver(token)
}
}
}

View File

@ -1,19 +0,0 @@
//
// OTRXMPPStream.h
// ChatSecure
//
// Created by Chris Ballinger on 2/3/17.
// Copyright © 2017 Chris Ballinger. All rights reserved.
//
@import Foundation;
@import XMPPFramework;
@interface OTRXMPPStream : XMPPStream
/**
* The connected servers hostname. The last attempted hostname before the socket actually connects to an IP address (e.g. after SRV lookup)
**/
@property (nonatomic, readonly, nullable) NSString *connectedHostName;
@end

View File

@ -1,24 +0,0 @@
//
// OTRXMPPStream.m
// ChatSecure
//
// Created by Chris Ballinger on 2/3/17.
// Copyright © 2017 Chris Ballinger. All rights reserved.
//
#import "OTRXMPPStream.h"
@interface XMPPStream(Overrides)
- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;
@end
@implementation OTRXMPPStream
/** Override */
- (BOOL)connectToHost:(NSString *)host onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr
{
_connectedHostName = [host copy];
return [super connectToHost:host onPort:port withTimeout:timeout error:errPtr];
}
@end

View File

@ -1,13 +0,0 @@
//
// OTRFacebookOAuthXMPPAccount.h
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTROAuthXMPPAccount.h"
@interface OTRFacebookOAuthXMPPAccount : OTROAuthXMPPAccount
@end

View File

@ -1,13 +0,0 @@
//
// OTRFacebookOAuthXMPPAccount.m
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTRFacebookOAuthXMPPAccount.h"
@implementation OTRFacebookOAuthXMPPAccount
@end

View File

@ -1,13 +0,0 @@
//
// OTRGoogleOAuthXMPPAccount.h
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTROAuthXMPPAccount.h"
@interface OTRGoogleOAuthXMPPAccount : OTROAuthXMPPAccount
@end

View File

@ -1,98 +0,0 @@
//
// OTRGoogleOAuthXMPPAccount.m
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTRGoogleOAuthXMPPAccount.h"
@import gtm_oauth2;
@import OTRAssets;
#import "OTRConstants.h"
NSString *const kOTRExpirationDateKey = @"kOTRExpirationDateKey";
NSString *const kOTRExpiresInKey = @"expires_in";
@implementation OTRGoogleOAuthXMPPAccount
- (UIImage *)accountImage
{
return [UIImage imageNamed:OTRGoogleTalkImageName inBundle:[OTRAssets resourcesBundle] compatibleWithTraitCollection:nil];
}
-(NSString *)accessTokenString {
return [self authToken].accessToken;
}
-(void)setOAuthTokenDictionary:(NSDictionary *)oAuthTokenDictionary
{
if ([oAuthTokenDictionary count]) {
NSMutableDictionary * mutableTokenDictionary = [oAuthTokenDictionary mutableCopy];
NSNumber * expiresIn = [mutableTokenDictionary objectForKey:kOTRExpiresInKey];
[mutableTokenDictionary removeObjectForKey:kOTRExpiresInKey];
NSDate *date = nil;
if (expiresIn) {
unsigned long deltaSeconds = [expiresIn unsignedLongValue];
if (deltaSeconds > 0) {
date = [NSDate dateWithTimeIntervalSinceNow:deltaSeconds];
}
}
if(date) {
[mutableTokenDictionary setObject:date forKey:kOTRExpirationDateKey];
}
oAuthTokenDictionary = mutableTokenDictionary;
}
[super setOAuthTokenDictionary:oAuthTokenDictionary];
}
-(NSDictionary *)oAuthTokenDictionary
{
NSMutableDictionary * mutableTokenDictionary = [[super oAuthTokenDictionary] mutableCopy];
NSDate * expirationDate = [mutableTokenDictionary objectForKey:kOTRExpirationDateKey];
NSTimeInterval timeInterval = [expirationDate timeIntervalSinceDate:[NSDate date]];
mutableTokenDictionary[kOTRExpiresInKey] = @(timeInterval);
return mutableTokenDictionary;
}
-(GTMOAuth2Authentication *)authToken
{
GTMOAuth2Authentication * auth = nil;
NSDictionary * tokenDictionary = [self oAuthTokenDictionary];
if ([tokenDictionary count]) {
auth = [[GTMOAuth2Authentication alloc] init];
[auth setParameters:[tokenDictionary mutableCopy]];
} else {
return nil;
}
auth.clientID = [OTRBranding googleAppId];
auth.clientSecret = [OTRSecrets googleAppSecret];
auth.scope = [OTRBranding googleAppScope];
auth.tokenURL = [GTMOAuth2SignIn googleTokenURL];
return auth;
}
- (id)accountSpecificToken
{
return [self authToken];
}
- (void)setAccountSpecificToken:(id)accountSpecificToken
{
if ([accountSpecificToken isKindOfClass:[GTMOAuth2Authentication class]]) {
GTMOAuth2Authentication *token = (GTMOAuth2Authentication *)accountSpecificToken;
[self setOAuthTokenDictionary:token.parameters];
}
}
#pragma - mark Class Methods
+ (NSString *)collection
{
return NSStringFromClass([OTRAccount class]);
}
@end

View File

@ -1,16 +0,0 @@
//
// OTROAuthXMPPAccount.h
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTRXMPPAccount.h"
@interface OTROAuthXMPPAccount : OTRXMPPAccount
@property (nonatomic, strong) NSDictionary *oAuthTokenDictionary;
@property (nonatomic, strong) id accountSpecificToken;
@end

View File

@ -1,94 +0,0 @@
//
// OTROAuthXMPPAccount.m
// Off the Record
//
// Created by David Chiles on 3/28/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTROAuthXMPPAccount.h"
@import SAMKeychain;
#import "OTRLog.h"
#import "OTRConstants.h"
@implementation OTROAuthXMPPAccount
-(void)setPassword:(NSString *)password
{
if(![password length])
{
[self setOAuthTokenDictionary:nil];
}
}
-(NSString *)password
{
return [self accessTokenString];
}
-(NSString *)accessTokenString
{
return @"";
}
-(void)setOAuthTokenDictionary:(NSDictionary *)oAuthTokenDictionary
{
if (![oAuthTokenDictionary count]) {
[super setPassword:nil];
}
else {
NSError *error = nil;
SAMKeychainQuery * keychainQuery = [self baseKeychainQuery];
keychainQuery.passwordObject = oAuthTokenDictionary;
[keychainQuery save:&error];
if (error) {
DDLogError(@"Error saving password to keychain: %@%@", [error localizedDescription], [error userInfo]);
}
}
}
- (NSDictionary *)oAuthTokenDictionary
{
NSError * error = nil;
NSDictionary *dictionary = nil;
SAMKeychainQuery * keychainQuery = [self baseKeychainQuery];
[keychainQuery fetch:&error];
if (error) {
DDLogError(@"Error retreiving password from keychain: %@%@", [error localizedDescription], [error userInfo]);
error = nil;
}
else {
dictionary = (NSDictionary *)keychainQuery.passwordObject;
}
return dictionary;
}
-(SAMKeychainQuery *)baseKeychainQuery
{
SAMKeychainQuery * keychainQuery = [[SAMKeychainQuery alloc] init];
keychainQuery.service = kOTRServiceName;
keychainQuery.account = self.uniqueId;
return keychainQuery;
}
#pragma - mark Class Methods
+ (NSString *)collection
{
return NSStringFromClass([OTRAccount class]);
}
+ (NSDictionary*) encodingBehaviorsByPropertyKey {
NSMutableDictionary *encodingBehaviors = [NSMutableDictionary dictionaryWithDictionary:[super encodingBehaviorsByPropertyKey]];
[encodingBehaviors setObject:@(MTLModelEncodingBehaviorExcluded) forKey:NSStringFromSelector(@selector(accountSpecificToken))];
[encodingBehaviors setObject:@(MTLModelEncodingBehaviorExcluded) forKey:NSStringFromSelector(@selector(oAuthTokenDictionary))];
return encodingBehaviors;
}
@end

View File

@ -1,14 +0,0 @@
//
// OTRGoolgeOAuthLoginHandler.h
// ChatSecure
//
// Created by David Chiles on 5/13/15.
// Copyright (c) 2015 Chris Ballinger. All rights reserved.
//
@import Foundation;
#import "OTRXMPPLoginHandler.h"
@interface OTRGoolgeOAuthLoginHandler : OTRXMPPLoginHandler
@end

View File

@ -1,36 +0,0 @@
//
// OTRGoolgeOAuthLoginHandler.m
// ChatSecure
//
// Created by David Chiles on 5/13/15.
// Copyright (c) 2015 Chris Ballinger. All rights reserved.
//
#import "OTRGoolgeOAuthLoginHandler.h"
#import "OTRGoogleOAuthXMPPAccount.h"
#import "OTROAuthRefresher.h"
#import "OTRXMPPLoginHandler.h"
#import "OTRXMPPManager.h"
@implementation OTRGoolgeOAuthLoginHandler
- (void)performActionWithValidForm:(XLFormDescriptor *)form account:(OTROAuthXMPPAccount *)account progress:(void (^)(NSInteger progress, NSString *summaryString))progress completion:(void (^)(OTRAccount * account, NSError *error))completion
{
[OTROAuthRefresher refreshAccount:account completion:^(id token, NSError *error) {
if (!error) {
account.accountSpecificToken = token;
[super performActionWithValidForm:form account:account progress:progress completion:completion];
} else if (completion) {
//Error refreshing account
completion(account, error);
}
}];
}
// Override superclass to prevent password clash
- (void) finishConnectingWithForm:(XLFormDescriptor *)form account:(OTRXMPPAccount *)account {
[self prepareForXMPPConnectionFrom:form account:account];
[self.xmppManager connectUserInitiated:YES];
}
@end

View File

@ -1,36 +0,0 @@
//
// OTRStoreViewController.h
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
#import "OTRStoreTableViewCell.h"
#import "OTRPurchaseController.h"
#import "OTRPushController.h"
@interface OTRStoreViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, OTRPurchaseControllerDelegate>
@property (nonatomic, weak) OTRPurchaseController *purchaseController;
@property (nonatomic, weak) OTRPushController *pushController;
@property (nonatomic, weak) NSArray *products;
@property (nonatomic, strong) UITableView *productTableView;
@end

View File

@ -1,186 +0,0 @@
//
// OTRStoreViewController.m
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import "OTRStoreViewController.h"
#import "MBProgressHUD.h"
#import "Strings.h"
#import "OTRPushAccessViewController.h"
#import "OTRConstants.h"
enum {
ACCOUNT_INFO_SECTION = 0,
PATS_SECTION,
PRODUCTS_SECTION
};
enum {
ACCOUNT_INFO_ACCOUNT_ROW = 0,
ACCOUNT_INFO_PASSWORD_ROW,
ACCOUNT_INFO_EXPIRATION_ROW
};
@interface OTRStoreViewController ()
@end
@implementation OTRStoreViewController
@synthesize productTableView, products, purchaseController, pushController;
- (void) dealloc {
self.productTableView = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (id)init {
if(self = [super init]) {
self.productTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
self.productTableView.delegate = self;
self.productTableView.dataSource = self;
self.title = STORE_STRING;
self.purchaseController = [OTRPurchaseController sharedInstance];
self.pushController = [OTRPushController sharedInstance];
purchaseController.delegate = self;
self.products = [NSArray array];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:RESTORE_STRING style:UIBarButtonItemStyleBordered target:self action:@selector(restorePurchases:)];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedProductUpdateNotification:) name:kOTRPurchaseControllerProductUpdateNotification object:purchaseController];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedProductUpdateNotification:) name:kOTRPushAccountUpdateNotification object:pushController];
}
return self;
}
- (void) receivedProductUpdateNotification:(NSNotification*)notification {
[self.productTableView reloadData];
}
- (void) loadView {
[super loadView];
[self.view addSubview:productTableView];
}
- (void) hideHUD {
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
- (void) showHUD {
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
}
- (void) restorePurchases:(id)sender {
[purchaseController restorePurchases];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.productTableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
self.productTableView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self showHUD];
[purchaseController requestProducts];
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == ACCOUNT_INFO_SECTION) {
static NSString *cellIdentifier = @"InfoCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
if (indexPath.row == ACCOUNT_INFO_ACCOUNT_ROW) {
cell.textLabel.text = ACCOUNT_ID_STRING;
cell.detailTextLabel.text = pushController.accountID;
} else if (indexPath.row == ACCOUNT_INFO_PASSWORD_ROW) {
cell.textLabel.text = PASSWORD_STRING;
cell.detailTextLabel.text = pushController.password;
} else if (indexPath.row == ACCOUNT_INFO_EXPIRATION_ROW) {
cell.textLabel.text = EXPIRATION_TITLE_STRING;
cell.detailTextLabel.text = [pushController.expirationDate description];
}
return cell;
}
if (indexPath.section == PRODUCTS_SECTION) {
static NSString *cellIdentifier = @"StoreCellIdentifier";
OTRStoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[OTRStoreTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
SKProduct *product = [products objectAtIndex:indexPath.row];
cell.product = product;
return cell;
}
if (indexPath.section == PATS_SECTION) {
static NSString *cellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.textLabel.text = PATS_SECTION_STRING;
return cell;
}
return nil;
}
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.section == PATS_SECTION) {
OTRPushAccessViewController *patViewController = [[OTRPushAccessViewController alloc] init];
[self.navigationController pushViewController:patViewController animated:YES];
}
}
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 3;
}
- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if (section == ACCOUNT_INFO_SECTION) {
return ACCOUNT_INFO_STRING;
} else if (section == PRODUCTS_SECTION) {
return PRODUCTS_SECTION_STRING;
} else if (section == PATS_SECTION) {
return PATS_SECTION_STRING;
}
return nil;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section == ACCOUNT_INFO_SECTION) {
return 3;
} else if (section == PRODUCTS_SECTION) {
return [products count];
} else if (section == PATS_SECTION) {
return 1;
}
return 0;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void) productsUpdated:(NSArray*)newProducts {
self.products = newProducts;
[self hideHUD];
[self.productTableView reloadData];
}
@end

View File

@ -1,294 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.17" systemVersion="16F2073" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="gpY-7F-1nv">
<device id="retina4_0" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.14"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Purchase View Controller-->
<scene sceneID="IEN-E6-Trv">
<objects>
<viewController id="gpY-7F-1nv" customClass="PurchaseViewController" customModule="ChatSecureCore" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Iq9-D8-dij"/>
<viewControllerLayoutGuide type="bottom" id="QwV-if-gsM"/>
</layoutGuides>
<view key="view" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="peW-Bv-YYS">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Thank you!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="z0b-01-F8c">
<rect key="frame" x="88.5" y="40" width="143" height="124"/>
<fontDescription key="fontDescription" type="system" pointSize="30"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="tzh-dS-ZUa">
<rect key="frame" x="8" y="202" width="304" height="80"/>
<constraints>
<constraint firstAttribute="height" constant="80" id="Kw4-oY-0g6"/>
</constraints>
<string key="text">Help us make developing free and open source privacy tools sustainable. We welcome any contribution to support ongoing development. </string>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NHC-BV-VjX">
<rect key="frame" x="16" y="518" width="53" height="30"/>
<state key="normal" title="Restore"/>
<connections>
<action selector="restoreButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="Fsq-Es-0M2"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gXX-QC-Oew">
<rect key="frame" x="218" y="518" width="86" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="wUL-Ha-GfW"/>
</constraints>
<state key="normal" title="Maybe Later"/>
<connections>
<segue destination="IC3-R1-eWi" kind="show" identifier="maybeLaterSegue" id="tn7-VO-3bW"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Kx-N0-Yqp" userLabel="IAP Buttons View">
<rect key="frame" x="8" y="411" width="304" height="99"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="boG-Bi-Djt">
<rect key="frame" x="106" y="34.5" width="92" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="92" id="oqS-bf-dPs"/>
</constraints>
<state key="normal" title="🍺 $5.99/mo"/>
<connections>
<action selector="mediumMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="tbX-rd-nIN"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="647-wq-NMP">
<rect key="frame" x="203" y="34.5" width="99" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="99" id="d8H-xD-nje"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<state key="normal" title="🎁 $19.99/mo"/>
<connections>
<action selector="bigMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="IPi-GG-LnN"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fmr-wM-gJf">
<rect key="frame" x="8" y="34.5" width="96" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="96" id="MID-1x-8IL"/>
</constraints>
<state key="normal" title=" ☕️ $2.99/mo"/>
<connections>
<action selector="smallMoneyButtonPressed:" destination="gpY-7F-1nv" eventType="touchUpInside" id="Y1E-2a-AEZ"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="fmr-wM-gJf" firstAttribute="leading" secondItem="9Kx-N0-Yqp" secondAttribute="leading" constant="8" id="1BE-Z7-0fj"/>
<constraint firstAttribute="height" constant="99" id="3AB-qU-aP0"/>
<constraint firstAttribute="trailing" secondItem="647-wq-NMP" secondAttribute="trailing" constant="2" id="4l0-3t-pvh"/>
<constraint firstItem="647-wq-NMP" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="5Jx-L6-0K2"/>
<constraint firstItem="647-wq-NMP" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="boG-Bi-Djt" secondAttribute="trailing" constant="2" id="Af7-yx-GZi"/>
<constraint firstItem="boG-Bi-Djt" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="T7U-BC-XxD"/>
<constraint firstItem="fmr-wM-gJf" firstAttribute="centerY" secondItem="9Kx-N0-Yqp" secondAttribute="centerY" id="bfM-bM-SwJ"/>
<constraint firstItem="boG-Bi-Djt" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="fmr-wM-gJf" secondAttribute="trailing" constant="2" id="mZL-5u-FIt"/>
<constraint firstItem="boG-Bi-Djt" firstAttribute="centerX" secondItem="9Kx-N0-Yqp" secondAttribute="centerX" id="xvx-9z-JTr"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="TopLeft" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="L5z-3N-jCk">
<rect key="frame" x="8" y="290" width="304" height="113"/>
<constraints>
<constraint firstAttribute="height" constant="113" id="qDI-VN-1U7"/>
</constraints>
<attributedString key="attributedText">
<fragment>
<string key="content">• Feel good supporting indie software
• Continued development and updates
• Help keep the app free for everyone
</string>
<attributes>
<font key="NSFont" size="17" name=".AppleSystemUIFont"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment>
<string key="content" base64-UTF8="YES">
Cg
</string>
<attributes>
<font key="NSFont" size="10" name=".SFNSText"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="This is a monthly, auto-renewing subscription. Terms: chatsecure.org/terms Privacy: chatsecure.org/privacy ">
<attributes>
<font key="NSFont" size="12" name=".SFNSText"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="NHC-BV-VjX" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leadingMargin" id="3Ls-pR-mfZ"/>
<constraint firstItem="9Kx-N0-Yqp" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="3g8-Q4-0ei"/>
<constraint firstItem="L5z-3N-jCk" firstAttribute="top" secondItem="tzh-dS-ZUa" secondAttribute="bottom" constant="8" id="3g9-MG-GAz"/>
<constraint firstItem="9Kx-N0-Yqp" firstAttribute="top" secondItem="L5z-3N-jCk" secondAttribute="bottom" constant="8" id="FfC-bQ-6js"/>
<constraint firstItem="gXX-QC-Oew" firstAttribute="trailing" secondItem="peW-Bv-YYS" secondAttribute="trailingMargin" id="JVt-Nv-DaQ"/>
<constraint firstItem="z0b-01-F8c" firstAttribute="top" secondItem="Iq9-D8-dij" secondAttribute="bottom" constant="20" id="TCP-xD-oSg"/>
<constraint firstAttribute="trailing" secondItem="9Kx-N0-Yqp" secondAttribute="trailing" constant="8" id="Y57-Vy-ehS"/>
<constraint firstItem="tzh-dS-ZUa" firstAttribute="top" secondItem="z0b-01-F8c" secondAttribute="bottom" constant="38" id="YFW-lj-qTn"/>
<constraint firstAttribute="trailing" secondItem="L5z-3N-jCk" secondAttribute="trailing" constant="8" id="a3a-vh-d2x"/>
<constraint firstItem="z0b-01-F8c" firstAttribute="centerX" secondItem="peW-Bv-YYS" secondAttribute="centerX" id="b6j-hF-k4Q"/>
<constraint firstItem="QwV-if-gsM" firstAttribute="top" secondItem="NHC-BV-VjX" secondAttribute="bottom" constant="20" id="gfh-PU-VRs"/>
<constraint firstItem="QwV-if-gsM" firstAttribute="top" secondItem="gXX-QC-Oew" secondAttribute="bottom" constant="20" id="n6r-dW-Zc5"/>
<constraint firstItem="tzh-dS-ZUa" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="prV-fI-OYz"/>
<constraint firstItem="L5z-3N-jCk" firstAttribute="leading" secondItem="peW-Bv-YYS" secondAttribute="leading" constant="8" id="uKF-kS-Jsl"/>
<constraint firstItem="gXX-QC-Oew" firstAttribute="top" secondItem="9Kx-N0-Yqp" secondAttribute="bottom" constant="8" id="uVB-NP-i6z"/>
<constraint firstAttribute="trailing" secondItem="tzh-dS-ZUa" secondAttribute="trailing" constant="8" id="wz4-Pk-Mga"/>
</constraints>
</view>
<connections>
<outlet property="bigMoneyButton" destination="647-wq-NMP" id="GrV-zj-vYS"/>
<outlet property="mediumMoneyButton" destination="boG-Bi-Djt" id="jav-TU-9Pu"/>
<outlet property="smallMoneyButton" destination="fmr-wM-gJf" id="1NI-Xh-aYF"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="K78-wq-a6D" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-401.25" y="166.25"/>
</scene>
<!--Maybe Later View Controller-->
<scene sceneID="bxY-k8-xlG">
<objects>
<viewController storyboardIdentifier="moreWaysToHelp" id="IC3-R1-eWi" customClass="MaybeLaterViewController" customModule="ChatSecureCore" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="voe-yP-IWR"/>
<viewControllerLayoutGuide type="bottom" id="hNv-Ah-nAt"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="ijh-fq-dON">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="More Ways to Help" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="97z-ZP-B7P">
<rect key="frame" x="24" y="40" width="272" height="36"/>
<fontDescription key="fontDescription" type="system" pointSize="30"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Can't spare the cash right now? There are plenty of other ways to contribute. " textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="dEy-M2-DVk">
<rect key="frame" x="16" y="92" width="288" height="61"/>
<constraints>
<constraint firstAttribute="height" constant="61" id="eTe-hN-cnT"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VSE-2h-AoI">
<rect key="frame" x="251" y="518" width="41" height="30"/>
<state key="normal" title="Finish"/>
<connections>
<action selector="dismissButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="GyF-cY-oKZ"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="b7t-YO-UNy">
<rect key="frame" x="24" y="215.5" width="272" height="237"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AUB-hE-6FZ">
<rect key="frame" x="78" y="8" width="116" height="30"/>
<state key="normal" title="Spread the Word"/>
<connections>
<action selector="shareButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="OIb-uk-2WH"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="byp-Sd-dEW">
<rect key="frame" x="87" y="46" width="99" height="30"/>
<state key="normal" title="Help Translate"/>
<connections>
<action selector="translateButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="wkl-kQ-eqX"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JvN-7y-LU8">
<rect key="frame" x="64.5" y="84" width="144" height="30"/>
<state key="normal" title="Join the Beta Testers"/>
<connections>
<action selector="joinBetaPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="LeL-Wm-Nny"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ui4-L3-zT2">
<rect key="frame" x="74" y="122" width="124" height="30"/>
<state key="normal" title="Submit your Ideas"/>
<connections>
<action selector="submitIdeasPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="6KG-J6-yCQ"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ynN-Or-UyI">
<rect key="frame" x="77" y="160" width="118" height="30"/>
<state key="normal" title="File a Bug Report"/>
<connections>
<action selector="fileBugPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="oyD-cC-I3A"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NFE-tU-GVQ">
<rect key="frame" x="52" y="198" width="169" height="30"/>
<state key="normal" title="Review on the App Store"/>
<connections>
<action selector="reviewButtonPressed:" destination="IC3-R1-eWi" eventType="touchUpInside" id="lHd-ca-cyC"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="byp-Sd-dEW" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="EyY-wO-6Fe"/>
<constraint firstItem="Ui4-L3-zT2" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="Fju-XI-2oN"/>
<constraint firstItem="ynN-Or-UyI" firstAttribute="top" secondItem="Ui4-L3-zT2" secondAttribute="bottom" constant="8" id="GAP-kd-4Ut"/>
<constraint firstItem="NFE-tU-GVQ" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="HKL-2q-jWn"/>
<constraint firstItem="byp-Sd-dEW" firstAttribute="top" secondItem="AUB-hE-6FZ" secondAttribute="bottom" constant="8" id="ZKr-Gz-5uV"/>
<constraint firstItem="JvN-7y-LU8" firstAttribute="top" secondItem="byp-Sd-dEW" secondAttribute="bottom" constant="8" id="bT9-xo-zw5"/>
<constraint firstItem="JvN-7y-LU8" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="ccG-JC-PZw"/>
<constraint firstItem="AUB-hE-6FZ" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="dFW-fP-XNt"/>
<constraint firstAttribute="height" constant="237" id="dYn-Go-epJ"/>
<constraint firstItem="ynN-Or-UyI" firstAttribute="centerX" secondItem="b7t-YO-UNy" secondAttribute="centerX" id="l1W-oC-gVn"/>
<constraint firstItem="AUB-hE-6FZ" firstAttribute="top" secondItem="b7t-YO-UNy" secondAttribute="top" constant="8" id="tjZ-Sf-1YG"/>
<constraint firstItem="NFE-tU-GVQ" firstAttribute="top" secondItem="ynN-Or-UyI" secondAttribute="bottom" constant="8" id="wCs-Pd-Y6s"/>
<constraint firstItem="Ui4-L3-zT2" firstAttribute="top" secondItem="JvN-7y-LU8" secondAttribute="bottom" constant="8" id="yNf-Wb-BLe"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="97z-ZP-B7P" secondAttribute="trailing" constant="8" id="3gH-2g-ZKl"/>
<constraint firstItem="b7t-YO-UNy" firstAttribute="centerY" secondItem="ijh-fq-dON" secondAttribute="centerY" constant="50" id="8Bh-YY-2KH"/>
<constraint firstItem="VSE-2h-AoI" firstAttribute="trailing" secondItem="ijh-fq-dON" secondAttribute="trailingMargin" constant="-12" id="DNI-EF-njD"/>
<constraint firstAttribute="trailing" secondItem="dEy-M2-DVk" secondAttribute="trailing" constant="16" id="ESJ-AZ-Deb"/>
<constraint firstItem="dEy-M2-DVk" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leading" constant="16" id="Kpr-UL-8uK"/>
<constraint firstItem="b7t-YO-UNy" firstAttribute="centerX" secondItem="ijh-fq-dON" secondAttribute="centerX" id="Mkv-TF-j9Y"/>
<constraint firstAttribute="trailingMargin" secondItem="b7t-YO-UNy" secondAttribute="trailing" constant="8" id="YpF-OM-8ES"/>
<constraint firstItem="97z-ZP-B7P" firstAttribute="top" secondItem="voe-yP-IWR" secondAttribute="bottom" constant="20" id="aNc-4A-ZdK"/>
<constraint firstItem="b7t-YO-UNy" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leadingMargin" constant="8" id="hTw-Mc-9Bh"/>
<constraint firstItem="hNv-Ah-nAt" firstAttribute="top" secondItem="VSE-2h-AoI" secondAttribute="bottom" constant="20" id="ncl-4B-LUm"/>
<constraint firstItem="97z-ZP-B7P" firstAttribute="leading" secondItem="ijh-fq-dON" secondAttribute="leadingMargin" constant="8" id="ocS-St-uVa"/>
<constraint firstItem="dEy-M2-DVk" firstAttribute="top" secondItem="97z-ZP-B7P" secondAttribute="bottom" constant="16" id="uWm-jY-5ea"/>
</constraints>
</view>
<connections>
<outlet property="subheadingLabel" destination="dEy-M2-DVk" id="eh2-Dc-mih"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8Af-JD-7ZL" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="451.875" y="166.90140845070422"/>
</scene>
</scenes>
</document>

View File

@ -1,466 +0,0 @@
//
// OMEMODeviceVerificationViewController.swift
// ChatSecure
//
// Created by Chris Ballinger on 10/13/16.
// Copyright © 2016 Chris Ballinger. All rights reserved.
//
import UIKit
import XLForm
import YapDatabase
import OTRAssets
open class KeyManagementViewController: XLFormViewController {
@objc open var completionBlock: (()->Void)?
// Crypto Chooser row tags
open static let DefaultRowTag = "DefaultRowTag"
open static let PlaintextRowTag = "PlaintextRowTag"
open static let OTRRowTag = "OTRRowTag"
open static let OMEMORowTag = "OMEMORowTag"
open static let ShowAdvancedCryptoSettingsTag = "ShowAdvancedCryptoSettingsTag"
open let accountKey:String
open var readConnection: YapDatabaseConnection
open var writeConnection: YapDatabaseConnection
lazy var signalCoordinator:OTROMEMOSignalCoordinator? = {
var account:OTRAccount? = nil
self.readConnection.read { (transaction) in
account = OTRAccount.fetchObject(withUniqueID: self.accountKey, transaction: transaction)
}
guard let acct = account else {
return nil
}
guard let xmpp = OTRProtocolManager.sharedInstance().protocol(for: acct) as? XMPPManager else {
return nil
}
return xmpp.omemoSignalCoordinator
}()
@objc public init(accountKey:String,
readConnection: YapDatabaseConnection,
writeConnection:YapDatabaseConnection,
form: XLFormDescriptor) {
self.accountKey = accountKey
self.readConnection = readConnection
self.writeConnection = writeConnection
super.init(nibName: nil, bundle: nil)
self.form = form
}
required public init!(coder aDecoder: NSCoder!) {
fatalError("init(coder:) has not been implemented")
}
open override func viewDidLoad() {
// gotta register cell before super
OMEMODeviceFingerprintCell.registerCellClass(OMEMODeviceFingerprintCell.defaultRowDescriptorType())
UserInfoProfileCell.registerCellClass(UserInfoProfileCell.defaultRowDescriptorType())
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed(_:)))
self.tableView.allowsMultipleSelectionDuringEditing = false
// Overriding superclass behaviour. This prevents the red icon on left of cell for deletion. Just want swipe to delete on device/fingerprint.
self.tableView.setEditing(false, animated: false)
}
open override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc open func doneButtonPressed(_ sender: AnyObject?) {
var devicesToSave: [OMEMODevice] = []
var otrFingerprintsToSave: [OTRFingerprint] = []
for (_, value) in form.formValues() {
switch value {
case let device as OMEMODevice:
devicesToSave.append(device)
case let fingerprint as OTRFingerprint:
otrFingerprintsToSave.append(fingerprint)
default:
break
}
}
OTRDatabaseManager.sharedInstance().readWriteDatabaseConnection?.asyncReadWrite({ (t: YapDatabaseReadWriteTransaction) in
for viewedDevice in devicesToSave {
if var device = t.object(forKey: viewedDevice.uniqueId, inCollection: OMEMODevice.collection) as? OMEMODevice {
device = device.copy() as! OMEMODevice
device.trustLevel = viewedDevice.trustLevel
if (device.trustLevel == .trustedUser && device.isExpired()) {
device.lastSeenDate = viewedDevice.lastSeenDate
}
device.save(with: t)
}
}
})
otrFingerprintsToSave.forEach { (fingerprint) in
OTRProtocolManager.encryptionManager.save(fingerprint)
}
if let completion = self.completionBlock {
completion()
}
dismiss(animated: true, completion: nil)
}
fileprivate func isAbleToDeleteCellAtIndexPath(_ indexPath:IndexPath) -> Bool {
if let rowDescriptor = self.form.formRow(atIndex: indexPath) {
switch rowDescriptor.value {
case let device as OMEMODevice:
if let myBundle = self.signalCoordinator?.fetchMyBundle() {
// This is only used to compare so we don't allow delete UI on our device
let thisDeviceYapKey = OMEMODevice.yapKey(withDeviceId: NSNumber(value: myBundle.deviceId as UInt32), parentKey: self.accountKey, parentCollection: OTRAccount.collection)
if device.uniqueId != thisDeviceYapKey {
return true
}
}
case let fingerprint as OTRFingerprint:
if (fingerprint.accountName != fingerprint.username) {
return true
}
default:
break
}
}
return false
}
fileprivate func performEdit(_ action:UITableViewCellEditingStyle, indexPath:IndexPath) {
if ( action == .delete ) {
if let rowDescriptor = self.form.formRow(atIndex: indexPath) {
rowDescriptor.sectionDescriptor.removeFormRow(rowDescriptor)
switch rowDescriptor.value {
case let device as OMEMODevice:
self.signalCoordinator?.removeDevice([device], completion: { (success) in
})
break
case let fingerprint as OTRFingerprint:
do {
try OTRProtocolManager.encryptionManager.otrKit.delete(fingerprint)
} catch {
}
break
default:
break
}
}
}
}
open static func cryptoChooserRows(_ buddy: OTRBuddy, connection: YapDatabaseConnection) -> [XLFormRowDescriptor] {
let bestAvailableRow = XLFormRowDescriptor(tag: DefaultRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Best_Available())
let plaintextOnlyRow = XLFormRowDescriptor(tag: PlaintextRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Plaintext_Only())
let plaintextOtrRow = XLFormRowDescriptor(tag: PlaintextRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: Plaintext_Opportunistic_OTR())
let otrRow = XLFormRowDescriptor(tag: OTRRowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: "OTR")
let omemoRow = XLFormRowDescriptor(tag: OMEMORowTag, rowType: XLFormRowDescriptorTypeBooleanCheck, title: "OMEMO")
var hasDevices = false
connection.read { (transaction: YapDatabaseReadTransaction) in
if OMEMODevice.allDevices(forParentKey: buddy.uniqueId, collection: type(of: buddy).collection, transaction: transaction).count > 0 {
hasDevices = true
}
}
if (!hasDevices) {
omemoRow.disabled = NSNumber(value: true as Bool)
}
let trueValue = NSNumber(value: true as Bool)
switch buddy.preferredSecurity {
case .plaintextOnly:
plaintextOnlyRow.value = trueValue
break
case .bestAvailable:
bestAvailableRow.value = trueValue
break
case .OTR:
otrRow.value = trueValue
break
case .OMEMO:
omemoRow.value = trueValue
break
case .omemOandOTR:
omemoRow.value = trueValue
break
case .plaintextWithOTR:
plaintextOtrRow.value = trueValue
}
let formRows = [bestAvailableRow, plaintextOnlyRow, plaintextOtrRow, otrRow, omemoRow]
var currentRow: XLFormRowDescriptor? = nil
var rowsToDeselect: NSMutableSet = NSMutableSet()
let onChangeBlock = { (oldValue: Any?, newValue: Any?, rowDescriptor: XLFormRowDescriptor) in
// Prevent infinite loops
// Allow deselection
if rowsToDeselect.count > 0 {
rowsToDeselect.remove(rowDescriptor)
return
}
if currentRow != nil {
return
}
currentRow = rowDescriptor
// Don't allow user to unselect a true value
if (newValue as AnyObject?)?.boolValue == false {
rowDescriptor.value = NSNumber(value: true as Bool)
currentRow = nil
return
}
// Deselect other rows
rowsToDeselect = NSMutableSet(array: formRows.filter({ $0 != rowDescriptor }))
for row in rowsToDeselect {
guard let row = row as? XLFormRowDescriptor else {
continue
}
let newValue = NSNumber(value: false as Bool)
row.value = newValue
// Wow that's janky
(row.sectionDescriptor.formDescriptor.delegate as! XLFormViewControllerDelegate).reloadFormRow!(row)
}
var preferredSecurity: OTRSessionSecurity = .bestAvailable
if (plaintextOnlyRow.value as AnyObject?)?.boolValue == true {
preferredSecurity = .plaintextOnly
} else if (otrRow.value as AnyObject?)?.boolValue == true {
preferredSecurity = .OTR
} else if (omemoRow.value as AnyObject?)?.boolValue == true {
preferredSecurity = .OMEMO
} else if (bestAvailableRow.value as AnyObject?)?.boolValue == true {
preferredSecurity = .bestAvailable
} else if (plaintextOtrRow.value as AnyObject?)?.boolValue == true {
preferredSecurity = .plaintextWithOTR
}
OTRDatabaseManager.sharedInstance().readWriteDatabaseConnection?.readWrite({ (transaction: YapDatabaseReadWriteTransaction) in
guard var buddy = transaction.object(forKey: buddy.uniqueId, inCollection: type(of: buddy).collection) as? OTRBuddy else {
return
}
guard let account = buddy.account(with: transaction) else {
return
}
buddy = buddy.copy() as! OTRBuddy
buddy.preferredSecurity = preferredSecurity
buddy.save(with: transaction)
// Cancel OTR session if plaintext or omemo only
if (preferredSecurity == .plaintextOnly || preferredSecurity == .OMEMO) {
OTRProtocolManager.encryptionManager.otrKit.disableEncryption(withUsername: buddy.username, accountName: account.username, protocol: account.protocolTypeString())
}
})
currentRow = nil
}
for row in formRows {
row.onChangeBlock = onChangeBlock
}
return formRows
}
//MARK UITableView Delegate overrides
open override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if self.isAbleToDeleteCellAtIndexPath(indexPath) {
return true
}
return false
}
open override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
if self.isAbleToDeleteCellAtIndexPath(indexPath) {
return .delete
}
return .none
}
open override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
self.performEdit(editingStyle, indexPath: indexPath)
}
@objc open static func profileFormDescriptorForAccount(_ account: OTRAccount, buddies: [OTRBuddy], connection: YapDatabaseConnection) -> XLFormDescriptor {
let form = XLFormDescriptor(title: Profile_String())
let yourProfileSection = XLFormSectionDescriptor.formSection(withTitle: Me_String())
let yourProfileRow = XLFormRowDescriptor(tag: account.uniqueId, rowType: UserInfoProfileCell.defaultRowDescriptorType())
yourProfileRow.value = account
yourProfileSection.addFormRow(yourProfileRow)
guard let xmpp = OTRProtocolManager.sharedInstance().protocol(for: account) as? XMPPManager else {
return form
}
guard let myBundle = xmpp.omemoSignalCoordinator?.fetchMyBundle() else {
return form
}
let thisDevice = OMEMODevice(deviceId: NSNumber(value: myBundle.deviceId as UInt32), trustLevel: .trustedUser, parentKey: account.uniqueId, parentCollection: type(of: account).collection, publicIdentityKeyData: myBundle.identityKey, lastSeenDate: Date())
var ourDevices: [OMEMODevice] = []
connection.read { (transaction: YapDatabaseReadTransaction) in
ourDevices = OMEMODevice.allDevices(forParentKey: account.uniqueId, collection: type(of: account).collection, transaction: transaction)
}
let ourFilteredDevices = ourDevices.filter({ (device: OMEMODevice) -> Bool in
return device.uniqueId != thisDevice.uniqueId
})
// TODO - Sort ourDevices and theirDevices by lastSeen
let addDevicesToSection: ([OMEMODevice], XLFormSectionDescriptor) -> Void = { devices, section in
for device in devices {
guard let _ = device.publicIdentityKeyData else {
continue
}
let row = XLFormRowDescriptor(tag: device.uniqueId, rowType: OMEMODeviceFingerprintCell.defaultRowDescriptorType())
row.value = device.copy()
// Don't allow editing of your own device
if device.uniqueId == thisDevice.uniqueId {
row.disabled = true
}
section.addFormRow(row)
}
}
let otrKit = OTRProtocolManager.encryptionManager.otrKit
let allFingerprints = otrKit.allFingerprints()
let myFingerprint = otrKit.fingerprint(forAccountName: account.username, protocol: account.protocolTypeString())
let addFingerprintsToSection: ([OTRFingerprint], XLFormSectionDescriptor) -> Void = { fingerprints, section in
for fingerprint in fingerprints {
let row = XLFormRowDescriptor(tag: (fingerprint.fingerprint as NSData).otr_hexString(), rowType: OMEMODeviceFingerprintCell.defaultRowDescriptorType())
if let myFingerprint = myFingerprint {
if (fingerprint === myFingerprint) {
// We implicitly trust ourselves with OTR
row.disabled = true
} else {
row.disabled = false
}
}
row.value = fingerprint
section.addFormRow(row)
}
}
var allMyDevices: [OMEMODevice] = []
allMyDevices.append(thisDevice)
allMyDevices.append(contentsOf: ourFilteredDevices)
addDevicesToSection(allMyDevices, yourProfileSection)
var theirSections: [XLFormSectionDescriptor] = []
if let myFingerprint = myFingerprint {
addFingerprintsToSection([myFingerprint], yourProfileSection)
}
// Add section for each buddy's device
for buddy in buddies {
let theirSection = XLFormSectionDescriptor.formSection(withTitle: buddy.username)
let buddyRow = XLFormRowDescriptor(tag: buddy.uniqueId, rowType: UserInfoProfileCell.defaultRowDescriptorType())
buddyRow.value = buddy
theirSection.addFormRow(buddyRow)
var theirDevices: [OMEMODevice] = []
connection.read({ (transaction: YapDatabaseReadTransaction) in
theirDevices = OMEMODevice.allDevices(forParentKey: buddy.uniqueId, collection: type(of: buddy).collection, transaction: transaction)
})
let theirFingerprints = allFingerprints.filter({ (fingerprint: OTRFingerprint) -> Bool in
return fingerprint.username == buddy.username &&
fingerprint.accountName == account.username
})
addDevicesToSection(theirDevices, theirSection)
addFingerprintsToSection(theirFingerprints, theirSection)
theirSections.append(theirSection)
}
var sectionsToAdd: [XLFormSectionDescriptor] = []
sectionsToAdd.append(contentsOf: theirSections)
// cryptoChooserRows is only meaningful for 1:1 conversations at the moment
if buddies.count == 1 {
let buddy = buddies.first!
let cryptoSection = XLFormSectionDescriptor.formSection(withTitle: Advanced_Encryption_Settings())
cryptoSection.footerTitle = Advanced_Crypto_Warning()
let showAdvancedSwitch = XLFormRowDescriptor.init(tag: self.ShowAdvancedCryptoSettingsTag, rowType: XLFormRowDescriptorTypeBooleanSwitch, title: Show_Advanced_Encryption_Settings())
showAdvancedSwitch.value = NSNumber(value: false as Bool)
let cryptoChooser = cryptoChooserRows(buddy, connection: connection)
for row in cryptoChooser {
cryptoSection.addFormRow(row)
}
cryptoSection.hidden = "$\(ShowAdvancedCryptoSettingsTag)==0"
let buddySection = theirSections.first!
buddySection.addFormRow(showAdvancedSwitch)
sectionsToAdd.append(cryptoSection)
}
sectionsToAdd.append(yourProfileSection)
for section in sectionsToAdd {
if section.formRows.count > 0 {
form.addFormSection(section)
}
}
return form
}
// MARK: - UITableViewDelegate
open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
super.tableView(tableView, didSelectRowAt: indexPath)
tableView.deselectRow(at: indexPath, animated: true)
guard let cell = self.tableView(tableView, cellForRowAt: indexPath) as? OMEMODeviceFingerprintCell else {
return
}
var fingerprint = ""
var username = ""
var cryptoType = ""
if let device = cell.rowDescriptor.value as? OMEMODevice {
cryptoType = "OMEMO"
fingerprint = device.humanReadableFingerprint
self.readConnection.read({ (transaction) in
if let buddy = transaction.object(forKey: device.parentKey, inCollection: device.parentCollection) as? OTRBuddy {
username = buddy.username
}
})
}
if let otrFingerprint = cell.rowDescriptor.value as? OTRFingerprint {
cryptoType = "OTR"
fingerprint = (otrFingerprint.fingerprint as NSData).humanReadableFingerprint()
username = otrFingerprint.username
}
if fingerprint.count == 0 || username.count == 0 || cryptoType.count == 0 {
return
}
let stringToShare = "\(username): \(cryptoType) \(fingerprint)"
let activityViewController = UIActivityViewController(activityItems: [stringToShare], applicationActivities: nil)
if let ppc = activityViewController.popoverPresentationController {
ppc.sourceView = cell
ppc.sourceRect = cell.frame
}
present(activityViewController, animated: true, completion: nil)
}
}

View File

@ -1,30 +0,0 @@
//
// OTRStoreTableViewCell.h
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface OTRStoreTableViewCell : UITableViewCell
@property (nonatomic, strong) SKProduct *product;
@end

View File

@ -1,66 +0,0 @@
//
// OTRStoreTableViewCell.m
// Off the Record
//
// Created by Christopher Ballinger on 9/28/12.
// Copyright (c) 2012 Chris Ballinger. All rights reserved.
//
// This file is part of ChatSecure.
//
// ChatSecure is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ChatSecure 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with ChatSecure. If not, see <http://www.gnu.org/licenses/>.
#import "OTRStoreTableViewCell.h"
#import "OTRPurchaseController.h"
#import "Strings.h"
@implementation OTRStoreTableViewCell
@synthesize product;
- (void) setProduct:(SKProduct *)newProduct {
product = newProduct;
self.textLabel.text = product.localizedTitle;
self.detailTextLabel.text = product.localizedDescription;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *priceString = [numberFormatter stringFromNumber:product.price];
BOOL productPurchased = [[OTRPurchaseController sharedInstance] isProductIdentifierPurchased:product.productIdentifier];
if (productPurchased) {
priceString = PURCHASED_STRING;
}
UISegmentedControl *buyButton = [[UISegmentedControl alloc]initWithItems:@[priceString]];
buyButton.segmentedControlStyle = UISegmentedControlStyleBar;
buyButton.momentary = YES;
if (productPurchased) {
buyButton.enabled = NO;
} else {
[buyButton addTarget:self
action:@selector(buyButtonPressed:)
forControlEvents:UIControlEventValueChanged];
}
self.accessoryView = buyButton;
}
- (void) buyButtonPressed:(id)sender {
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activityView startAnimating];
self.accessoryView = activityView;
[[OTRPurchaseController sharedInstance] buyProduct:self.product];
}
@end

View File

@ -1,29 +0,0 @@
//
// OTRPasswordStrengthTextField.h
// Off the Record
//
// Created by David Chiles on 5/1/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
@import UIKit;
@import Navajo;
@class OTRPasswordStrengthView;
@protocol OTRPasswordStrengthViewDelegate <NSObject>
- (void)passwordView:(OTRPasswordStrengthView *)view didChangePassword:(NSString *)password strength:(NJOPasswordStrength)strength failingRules:(NSArray *)rules;
@end
@interface OTRPasswordStrengthView : UIView
- (id)initWithRules:(NSArray *)rules;
- (id)initWithDefaultRules;
@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, weak) id<OTRPasswordStrengthViewDelegate> delegate;
@end

View File

@ -1,139 +0,0 @@
//
// OTRPasswordStrengthTextField.m
// Off the Record
//
// Created by David Chiles on 5/1/14.
// Copyright (c) 2014 Chris Ballinger. All rights reserved.
//
#import "OTRPasswordStrengthView.h"
@import PureLayout;
@interface OTRPasswordStrengthView ()
@property (nonatomic, strong) UIProgressView *passwordStrengthMeterView;
@property (nonatomic, strong) NJOPasswordValidator *validator;
@property (nonatomic) BOOL addedContraints;
@property (nonatomic, weak) id UITextFieldTextDidChangeNotificationObject;
@end
@implementation OTRPasswordStrengthView
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self.UITextFieldTextDidChangeNotificationObject];
}
- (id)initWithRules:(NSArray *)rules
{
if (self = [self initWithFrame:CGRectZero]) {
self.validator = [NJOPasswordValidator validatorWithRules:rules];
self.addedContraints = NO;
}
return self;
}
- (id)initWithDefaultRules
{
if (self = [self initWithFrame:CGRectZero]) {
self.validator = [NJOPasswordValidator standardValidator];
}
return self;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.passwordStrengthMeterView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
self.passwordStrengthMeterView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:self.passwordStrengthMeterView];
self.textField = [[UITextField alloc] initWithFrame:CGRectZero];
self.textField.secureTextEntry = YES;
self.textField.translatesAutoresizingMaskIntoConstraints = NO;
self.textField.clearButtonMode = UITextFieldViewModeWhileEditing;
[self addSubview:self.textField];
__weak OTRPasswordStrengthView *welf = self;
self.UITextFieldTextDidChangeNotificationObject = [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidChangeNotification object:self.textField queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
[welf updatePasswordStrength:note.object];
}];
[self updatePasswordStrength:self];
}
return self;
}
- (CGSize)intrinsicContentSize
{
return CGSizeMake(self.passwordStrengthMeterView.frame.size.width, self.passwordStrengthMeterView.frame.size.height+self.textField.frame.size.height+2);
}
- (void)updatePasswordStrength:(id)sender
{
NSString *password = self.textField.text;
NJOPasswordStrength strength = [NJOPasswordStrengthEvaluator strengthOfPassword:password];
NSArray *failingRules = nil;
if ([self.validator validatePassword:password failingRules:&failingRules]) {
switch (strength) {
case NJOVeryWeakPasswordStrength:
self.passwordStrengthMeterView.progress = 0.05f;
self.passwordStrengthMeterView.tintColor = [UIColor redColor];
break;
case NJOWeakPasswordStrength:
self.passwordStrengthMeterView.progress = 0.25f;
self.passwordStrengthMeterView.tintColor = [UIColor orangeColor];
break;
case NJOReasonablePasswordStrength:
self.passwordStrengthMeterView.progress = 0.5f;
self.passwordStrengthMeterView.tintColor = [UIColor yellowColor];
break;
case NJOStrongPasswordStrength:
self.passwordStrengthMeterView.progress = 0.75f;
self.passwordStrengthMeterView.tintColor = [UIColor greenColor];
break;
case NJOVeryStrongPasswordStrength:
self.passwordStrengthMeterView.progress = 1.0f;
self.passwordStrengthMeterView.tintColor = [UIColor cyanColor];
break;
}
}
else {
self.passwordStrengthMeterView.progress = 0.0f;
self.passwordStrengthMeterView.tintColor = [UIColor redColor];
}
if ([password length] == 0) {
self.passwordStrengthMeterView.progress = 0.0f;
}
if ([self.delegate respondsToSelector:@selector(passwordView:didChangePassword:strength:failingRules:)]) {
[self.delegate passwordView:self didChangePassword:password strength:strength failingRules:failingRules];
}
}
- (void)updateConstraints
{
if (!self.addedContraints) {
[self.textField autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero excludingEdge:ALEdgeBottom];
[self.passwordStrengthMeterView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero excludingEdge:ALEdgeTop];
[self.passwordStrengthMeterView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.textField withOffset:2.0];
self.addedContraints = YES;
}
[super updateConstraints];
}
@end

View File

@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).refresh</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
@ -15,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>4.3.0</string>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@ -35,7 +39,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>127</string>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>FacebookAppID</key>
<string>447241325394334</string>
<key>FacebookDisplayName</key>
@ -43,7 +47,9 @@
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
<string>51d17d3e-5e07-49ad-a308-9625d81e411f</string>
<string>$(EXPORT_COMPLIANCE_CODE)</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.social-networking</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
@ -74,19 +80,20 @@
<key>UIAppFonts</key>
<array>
<string>FontAwesome.ttf</string>
<string>OTRResources.bundle/MaterialIcons-Regular.ttf</string>
<string>OTRResources.bundle/ios-icon-font.ttf</string>
<string>MaterialIcons-Regular.ttf</string>
<string>ios-icon-font.ttf</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
<string>remote-notification</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>

7
ChatSecure/InfoPlist.h Normal file
View File

@ -0,0 +1,7 @@
//
// InfoPlist.h
// ChatSecure
//
// Created by Chris Ballinger on 10/27/19.
// Copyright © 2019 Chris Ballinger. All rights reserved.
//

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ZRl-hb-7fs">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Table View Controller-->
<scene sceneID="ECP-MZ-xYm">
<objects>
<tableViewController id="HLB-Xb-40a" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="80" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="0xl-e4-7or">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<connections>
<outlet property="dataSource" destination="HLB-Xb-40a" id="SyW-Kd-rpT"/>
<outlet property="delegate" destination="HLB-Xb-40a" id="WTb-ZI-jsv"/>
</connections>
</tableView>
<navigationItem key="navigationItem" id="jDn-Rl-4jF"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="DZk-ZY-fFe" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-498" y="394"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="m77-e3-WYR">
<objects>
<navigationController id="ZRl-hb-7fs" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="yuJ-Kr-8Hj">
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="HLB-Xb-40a" kind="relationship" relationship="rootViewController" id="5sj-7j-u5X"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="rhI-A3-3ff" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1416" y="394"/>
</scene>
</scenes>
</document>

View File

@ -1,124 +0,0 @@
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "iPhoneLaunch480h@2x.png",
"scale" : "2x"
},
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "retina4",
"filename" : "iPhoneLaunch568h@2x.png",
"minimum-system-version" : "7.0",
"orientation" : "portrait",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "iPadLaunchPortrait.png",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "iPadLaunchLandscape.png",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "iPadLaunchPortrait@2x.png",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "iPadLaunchLandscape@2x.png",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"subtype" : "retina4",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="8191" systemVersion="15A282b" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="80" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="iPu-HT-aag">
<rect key="frame" x="0.0" y="65" width="480" height="415"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableView>
<navigationBar contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Z9-o3-9ZF">
<rect key="frame" x="0.0" y="0.0" width="480" height="64"/>
<animations/>
<constraints>
<constraint firstAttribute="height" constant="64" id="Cs5-Xy-Q1I"/>
</constraints>
<color key="barTintColor" red="0.96862751245498657" green="0.96862751245498657" blue="0.96862751245498657" alpha="1" colorSpace="deviceRGB"/>
<items>
<navigationItem id="ke5-CU-CbA"/>
</items>
</navigationBar>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="iPu-HT-aag" firstAttribute="top" secondItem="6Z9-o3-9ZF" secondAttribute="bottom" constant="1" id="4Bh-C4-d2J"/>
<constraint firstItem="iPu-HT-aag" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="5PX-Ym-vSU"/>
<constraint firstAttribute="bottom" secondItem="iPu-HT-aag" secondAttribute="bottom" id="GXM-Bf-qmM"/>
<constraint firstItem="6Z9-o3-9ZF" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Qtv-PE-tRx"/>
<constraint firstAttribute="trailing" secondItem="iPu-HT-aag" secondAttribute="trailing" id="TYx-jK-g4H"/>
<constraint firstAttribute="trailing" secondItem="6Z9-o3-9ZF" secondAttribute="trailing" id="YK2-gG-uAt"/>
<constraint firstItem="6Z9-o3-9ZF" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="oSn-Le-D40"/>
</constraints>
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
<nil key="simulatedTopBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="408" y="458"/>
</view>
</objects>
</document>

View File

@ -1,26 +1,26 @@
name: Alamofire, nameSpecified:
body: Copyright (c) 2014-2…
version: 4.7.0
name: AFNetworking, nameSpecified:
body: Copyright (c) 2011-2…
version: 4.0.1
name: AFNetworking, nameSpecified:
body: Copyright (c) 2011-2…
version: 4.0.1
name: AFNetworking, nameSpecified:
body: Copyright (c) 2011-2…
version: 4.0.1
name: Alamofire, nameSpecified:
body: Copyright (c) 2014-2…
version: 4.7.0
version: 5.4.3
name: Alamofire, nameSpecified:
body: Copyright (c) 2014-2…
version: 4.7.0
version: 5.4.3
name: Appirater, nameSpecified:
body: Copyright 2017. Aras…
version: 2.3.1
name: Appirater, nameSpecified:
body: Copyright 2017. Aras…
version: 2.3.1
name: Appirater, nameSpecified:
body: Copyright 2017. Aras…
version: 2.3.1
name: Alamofire, nameSpecified:
body: Copyright (c) 2014-2…
version: 5.4.3
name: ARChromeActivity, nameSpecified:
body: ARChromeActivity
@ -63,105 +63,99 @@ version: 4.0.2
name: ChatSecure-Push-iOS, nameSpecified:
body: …
version: 1.0
version: 1.1
name: ChatSecure-Push-iOS, nameSpecified:
body: …
version: 1.0
version: 1.1
name: ChatSecure-Push-iOS, nameSpecified:
body: …
version: 1.0
version: 1.1
name: ChatSecureCore, nameSpecified:
body: ChatSecure, an OTR-c…
version: 1.0.0
name: ChatSecureCore, nameSpecified:
body: ChatSecure, an OTR-c…
version: 1.0.0
name: ChatSecureCore, nameSpecified:
body: ChatSecure, an OTR-c…
version: 1.0.0
name: CocoaAsyncSocket, nameSpecified:
body: Public Domain Licens…
version: 7.6.2
version: 7.6.5
name: CocoaAsyncSocket, nameSpecified:
body: Public Domain Licens…
version: 7.6.2
version: 7.6.5
name: CocoaAsyncSocket, nameSpecified:
body: Public Domain Licens…
version: 7.6.2
version: 7.6.5
name: CocoaLumberjack, nameSpecified:
body: Software License Agr
version: 3.4.1
body: BSD 3-Clause License
version: 3.7.2
name: CocoaLumberjack, nameSpecified:
body: Software License Agr
version: 3.4.1
body: BSD 3-Clause License
version: 3.7.2
name: CocoaLumberjack, nameSpecified:
body: Software License Agr…
version: 3.4.1
name: CPAProxy, nameSpecified:
body: Copyright (c) 2013 C…
version: 1.2.0
name: CPAProxy, nameSpecified:
body: Copyright (c) 2013 C…
version: 1.2.0
name: CPAProxy, nameSpecified:
body: Copyright (c) 2013 C…
version: 1.2.0
body: BSD 3-Clause License…
version: 3.7.2
name: DTFoundation, nameSpecified:
body: Copyright (c) 2011, …
version: 1.7.13
version: 1.7.18
name: DTFoundation, nameSpecified:
body: Copyright (c) 2011, …
version: 1.7.13
version: 1.7.18
name: DTFoundation, nameSpecified:
body: Copyright (c) 2011, …
version: 1.7.13
version: 1.7.18
name: FormatterKit, nameSpecified:
body: Copyright (c) 20112…
version: 1.9.0
name: FormatterKit, nameSpecified:
body: Copyright (c) 20112…
version: 1.9.0
name: FormatterKit, nameSpecified:
body: Copyright (c) 20112…
version: 1.9.0
name: GCDWebServer, nameSpecified:
body: Copyright (c) 2012-2…
version: 3.4.2
version: 3.5.4
name: GCDWebServer, nameSpecified:
body: Copyright (c) 2012-2…
version: 3.4.2
version: 3.5.4
name: GCDWebServer, nameSpecified:
body: Copyright (c) 2012-2…
version: 3.4.2
version: 3.5.4
name: gtm-http-fetcher, nameSpecified:
body:
version: 1.1
name: HTMLReader, nameSpecified:
body: HTMLReader is in the…
version: 2.1.7
name: gtm-http-fetcher, nameSpecified:
body:
version: 1.1
name: HTMLReader, nameSpecified:
body: HTMLReader is in the…
version: 2.1.7
name: gtm-http-fetcher, nameSpecified:
body:
version: 1.1
name: gtm-oauth2, nameSpecified:
body:
version: 1.1
name: gtm-oauth2, nameSpecified:
body:
version: 1.1
name: gtm-oauth2, nameSpecified:
body:
version: 1.1
name: HTMLReader, nameSpecified:
body: HTMLReader is in the…
version: 2.1.7
name: IOCipher, nameSpecified:
body: GNU LESSER GENER…
@ -207,57 +201,63 @@ version: 1.5.1
name: KissXML, nameSpecified:
body: Copyright (c) 2012, …
version: 5.2.2
version: 5.3.1
name: KissXML, nameSpecified:
body: Copyright (c) 2012, …
version: 5.2.2
version: 5.3.1
name: KissXML, nameSpecified:
body: Copyright (c) 2012, …
version: 5.2.2
name: KSCrash, nameSpecified:
body: Copyright (c) 2012 K…
version: 1.15.18
name: KSCrash, nameSpecified:
body: Copyright (c) 2012 K…
version: 1.15.18
name: KSCrash, nameSpecified:
body: Copyright (c) 2012 K…
version: 1.15.18
version: 5.3.1
name: Kvitto, nameSpecified:
body: Copyright (c) 2015, …
version: 1.0.3
version: 1.0.6
name: Kvitto, nameSpecified:
body: Copyright (c) 2015, …
version: 1.0.3
version: 1.0.6
name: Kvitto, nameSpecified:
body: Copyright (c) 2015, …
version: 1.0.3
version: 1.0.6
name: KVOController, nameSpecified:
body: BSD License
For KVO…
version: 1.2.0
name: KVOController, nameSpecified:
body: BSD License
For KVO…
version: 1.2.0
name: KVOController, nameSpecified:
body: BSD License
For KVO…
version: 1.2.0
name: libidn, nameSpecified:
body: libidn-podspec
The …
version: 1.33
version: 1.35
name: libidn, nameSpecified:
body: libidn-podspec
The …
version: 1.33
version: 1.35
name: libidn, nameSpecified:
body: libidn-podspec
The …
version: 1.33
version: 1.35
name: libsqlfs, nameSpecified:
body: GNU LESSER GENER…
@ -271,20 +271,62 @@ name: libsqlfs, nameSpecified:
body: GNU LESSER GENER…
version: 1.3.2
name: LumberjackConsole, nameSpecified:
body: Apache License
version: 3.3.0
name: LicensePlist, nameSpecified:
body: MIT License
Copyrig…
version: 3.13.0
name: LicensePlist, nameSpecified:
body: MIT License
Copyrig…
version: 3.13.0
name: LicensePlist, nameSpecified:
body: MIT License
Copyrig…
version: 3.13.0
name: LumberjackConsole, nameSpecified:
body: Apache License
version: 3.3.0
version: 3.3.1
name: LumberjackConsole, nameSpecified:
body: Apache License
version: 3.3.0
version: 3.3.1
name: LumberjackConsole, nameSpecified:
body: Apache License
version: 3.3.1
name: Mantle, nameSpecified:
body: **Copyright (c) GitH…
version: 2.1.6
name: Mantle, nameSpecified:
body: **Copyright (c) GitH…
version: 2.1.6
name: Mantle, nameSpecified:
body: **Copyright (c) GitH…
version: 2.1.6
name: MBProgressHUD, nameSpecified:
body: Copyright © 2009-202…
version: 1.2.0
name: MBProgressHUD, nameSpecified:
body: Copyright © 2009-202…
version: 1.2.0
name: MBProgressHUD, nameSpecified:
body: Copyright © 2009-202…
version: 1.2.0
name: MWFeedParser, nameSpecified:
body: Copyright (c) 2010 M…
@ -298,18 +340,6 @@ name: MWFeedParser, nameSpecified:
body: Copyright (c) 2010 M…
version: 1.0.1
name: Navajo, nameSpecified:
body: Copyright (c) 2014 M…
version: 0.0.1
name: Navajo, nameSpecified:
body: Copyright (c) 2014 M…
version: 0.0.1
name: Navajo, nameSpecified:
body: Copyright (c) 2014 M…
version: 0.0.1
name: NBUCore, nameSpecified:
body:
@ -325,29 +355,41 @@ body:
version: 2.1.0
name: OTRKit, nameSpecified:
body: Software License Agr…
version: 2.0.0
name: OTRAssets, nameSpecified:
body: ChatSecure, an OTR-c…
version: 0.1.0
name: OTRAssets, nameSpecified:
body: ChatSecure, an OTR-c…
version: 0.1.0
name: OTRAssets, nameSpecified:
body: ChatSecure, an OTR-c…
version: 0.1.0
name: OTRKit, nameSpecified:
body: Software License Agr…
version: 2.0.0
version: 3.0.0
name: OTRKit, nameSpecified:
body: Software License Agr…
version: 2.0.0
version: 3.0.0
name: OTRKit, nameSpecified:
body: Software License Agr…
version: 3.0.0
name: ParkedTextField, nameSpecified:
body: The MIT License (MIT…
version: 0.4.0
version: 1.0.0
name: ParkedTextField, nameSpecified:
body: The MIT License (MIT…
version: 0.4.0
version: 1.0.0
name: ParkedTextField, nameSpecified:
body: The MIT License (MIT…
version: 0.4.0
version: 1.0.0
name: ProxyKit, nameSpecified:
body: The MIT License (MIT…
@ -361,6 +403,18 @@ name: ProxyKit, nameSpecified:
body: The MIT License (MIT…
version: 1.2.0
name: PureLayout, nameSpecified:
body: This code is distrib…
version: 3.1.8
name: PureLayout, nameSpecified:
body: This code is distrib…
version: 3.1.8
name: PureLayout, nameSpecified:
body: This code is distrib…
version: 3.1.8
name: QRCodeReaderViewController, nameSpecified:
body: The MIT License (MIT…
version: 4.0.2
@ -373,89 +427,101 @@ name: QRCodeReaderViewController, nameSpecified:
body: The MIT License (MIT…
version: 4.0.2
name: Reveal-SDK, nameSpecified:
body: # REVEAL LICENSE AGR
version: 13
name: SAMKeychain, nameSpecified:
body: Copyright (c) 2010-2
version: 1.5.3
name: Reveal-SDK, nameSpecified:
body: # REVEAL LICENSE AGR
version: 13
name: SAMKeychain, nameSpecified:
body: Copyright (c) 2010-2
version: 1.5.3
name: Reveal-SDK, nameSpecified:
body: # REVEAL LICENSE AGR
version: 13
name: SAMKeychain, nameSpecified:
body: Copyright (c) 2010-2
version: 1.5.3
name: SignalProtocolC, nameSpecified:
body: Copyright 20
version: 2.3.1
body: Copy…
version: 2.3.2
name: SignalProtocolC, nameSpecified:
body: Copyright 20
version: 2.3.1
body: Copy…
version: 2.3.2
name: SignalProtocolC, nameSpecified:
body: Copyright 20
version: 2.3.1
body: Copy…
version: 2.3.2
name: SignalProtocolObjC, nameSpecified:
body: Copyright 2016-2017 …
version: 1.0.0
version: 1.1.0
name: SignalProtocolObjC, nameSpecified:
body: Copyright 2016-2017 …
version: 1.0.0
version: 1.1.0
name: SignalProtocolObjC, nameSpecified:
body: Copyright 2016-2017 …
version: 1.0.0
version: 1.1.0
name: SQLCipher, nameSpecified:
body: Copyright (c) 2008, …
version: 3.4.2
version: 4.4.3
name: SQLCipher, nameSpecified:
body: Copyright (c) 2008, …
version: 3.4.2
version: 4.4.3
name: SQLCipher, nameSpecified:
body: Copyright (c) 2008, …
version: 3.4.2
version: 4.4.3
name: TUSafariActivity, nameSpecified:
body: Copyright (c) 2012 T
version: 1.0.4
name: TTTAttributedLabel, nameSpecified:
body: Copyright (c) 2011 M
version: 2.0.0
name: TUSafariActivity, nameSpecified:
body: Copyright (c) 2012 T
version: 1.0.4
name: TTTAttributedLabel, nameSpecified:
body: Copyright (c) 2011 M
version: 2.0.0
name: TUSafariActivity, nameSpecified:
body: Copyright (c) 2012 T…
version: 1.0.4
name: TTTAttributedLabel, nameSpecified:
body: Copyright (c) 2011 M…
version: 2.0.0
name: XLForm, nameSpecified:
body: The MIT License (MIT…
version: 4.3.0
name: XLForm, nameSpecified:
body: The MIT License (MIT…
version: 4.3.0
name: XLForm, nameSpecified:
body: The MIT License (MIT…
version: 4.3.0
name: XMPPFramework, nameSpecified:
body: GCDAsyncSocket: (Pub…
version: 4.0
version: 4.1.1
name: XMPPFramework, nameSpecified:
body: GCDAsyncSocket: (Pub…
version: 4.0
version: 4.1.1
name: XMPPFramework, nameSpecified:
body: GCDAsyncSocket: (Pub…
version: 4.0
version: 4.1.1
name: YapDatabase, nameSpecified:
body: Software License Agr…
version: 3.0.2
version: 4.0.1
name: YapDatabase, nameSpecified:
body: Software License Agr…
version: 3.0.2
version: 4.0.1
name: YapDatabase, nameSpecified:
body: Software License Agr…
version: 3.0.2
version: 4.0.1
name: YapTaskQueue, nameSpecified:
body: This is free and une…
@ -469,29 +535,19 @@ name: YapTaskQueue, nameSpecified:
body: This is free and une…
version: 0.3.0
name: AFNetworking, nameSpecified: , owner: AFNetworking, version: 3.2.0
name: ZXingObjC, nameSpecified:
body: …
version: 3.6.5
name: FormatterKit, nameSpecified: , owner: mattt, version: 1.8.2
name: ZXingObjC, nameSpecified:
body: …
version: 3.6.5
name: HTMLReader, nameSpecified: , owner: nolanw, version: 1d0dda3
name: ZXingObjC, nameSpecified:
body: …
version: 3.6.5
name: KVOController, nameSpecified: , owner: facebook, version: v1.2.0
name: Mantle, nameSpecified: , owner: ChatSecure, version: 4c1a09c
name: MBProgressHUD, nameSpecified: , owner: jdg, version: 1.1.0
name: PureLayout, nameSpecified: , owner: PureLayout, version: v3.0.2
name: SAMKeychain, nameSpecified: , owner: soffes, version: v1.5.3
name: TTTAttributedLabel, nameSpecified: , owner: TTTAttributedLabel, version: 2.0.0
name: XLForm, nameSpecified: , owner: xmartlabs, version: 4.0.0
name: ZXingObjC, nameSpecified: , owner: TheLevelUp, version: 3.2.2
name: libevent, nameSpecified: , version: 2.0.22
name: libevent, nameSpecified: , version: 2.1.10
body: Libevent is availabl…
name: libgcrypt, nameSpecified: , version: 1.8.1
@ -500,16 +556,19 @@ body: Libgcrypt - The GNU …
name: libgpg-error, nameSpecified: , version:
body: Package: libgpg-erro…
name: liblzma, nameSpecified: , version: 5.2.4
body: liblzma is in the pu…
name: libotr, nameSpecified: , version: 4.1.1
body: Off-the-Record Messa…
name: OpenSSL, nameSpecified: , version: 1.0.2n
name: OpenSSL, nameSpecified: , version: 1.1.1c
body: LICENSE ISSUES
===…
name: Tor, nameSpecified: , version: 0.3.0.13
name: Tor, nameSpecified: , version: 0.4.0.5
body: This file contains t…
add-version-numbers: true
LicensePlist Version: 1.8.3
LicensePlist Version: 3.13.0

View File

@ -4,11 +4,17 @@
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>Licenses</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/AFNetworking</string>
<key>Title</key>
<string>AFNetworking (3.2.0)</string>
<string>AFNetworking (4.0.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -16,15 +22,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/Alamofire</string>
<key>Title</key>
<string>Alamofire (4.7.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/Appirater</string>
<key>Title</key>
<string>Appirater (2.3.1)</string>
<string>Alamofire (5.4.3)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -56,7 +54,15 @@
<key>File</key>
<string>com.mono0926.LicensePlist/ChatSecure-Push-iOS</string>
<key>Title</key>
<string>ChatSecure-Push-iOS (1.0)</string>
<string>ChatSecure-Push-iOS (1.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/ChatSecureCore</string>
<key>Title</key>
<string>ChatSecureCore (1.0.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -64,7 +70,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/CocoaAsyncSocket</string>
<key>Title</key>
<string>CocoaAsyncSocket (7.6.2)</string>
<string>CocoaAsyncSocket (7.6.5)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -72,15 +78,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/CocoaLumberjack</string>
<key>Title</key>
<string>CocoaLumberjack (3.4.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/CPAProxy</string>
<key>Title</key>
<string>CPAProxy (1.2.0)</string>
<string>CocoaLumberjack (3.7.2)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -88,7 +86,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/DTFoundation</string>
<key>Title</key>
<string>DTFoundation (1.7.13)</string>
<string>DTFoundation (1.7.18)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -96,7 +94,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/FormatterKit</string>
<key>Title</key>
<string>FormatterKit (1.8.2)</string>
<string>FormatterKit (1.9.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -104,23 +102,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/GCDWebServer</string>
<key>Title</key>
<string>GCDWebServer (3.4.2)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/gtm-http-fetcher</string>
<key>Title</key>
<string>gtm-http-fetcher (1.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/gtm-oauth2</string>
<key>Title</key>
<string>gtm-oauth2 (1.1)</string>
<string>GCDWebServer (3.5.4)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -128,7 +110,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/HTMLReader</string>
<key>Title</key>
<string>HTMLReader (1d0dda3)</string>
<string>HTMLReader (2.1.7)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -160,15 +142,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/KissXML</string>
<key>Title</key>
<string>KissXML (5.2.2)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/KSCrash</string>
<key>Title</key>
<string>KSCrash (1.15.18)</string>
<string>KissXML (5.3.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -176,7 +150,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/Kvitto</string>
<key>Title</key>
<string>Kvitto (1.0.3)</string>
<string>Kvitto (1.0.6)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -184,7 +158,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/KVOController</string>
<key>Title</key>
<string>KVOController (v1.2.0)</string>
<string>KVOController (1.2.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -192,7 +166,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/libevent</string>
<key>Title</key>
<string>libevent (2.0.22)</string>
<string>libevent (2.1.10)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -216,7 +190,15 @@
<key>File</key>
<string>com.mono0926.LicensePlist/libidn</string>
<key>Title</key>
<string>libidn (1.33)</string>
<string>libidn (1.35)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/liblzma</string>
<key>Title</key>
<string>liblzma (5.2.4)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -236,11 +218,19 @@
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/LicensePlist</string>
<key>Title</key>
<string>LicensePlist (3.13.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/LumberjackConsole</string>
<key>Title</key>
<string>LumberjackConsole (3.3.0)</string>
<string>LumberjackConsole (3.3.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -248,7 +238,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/Mantle</string>
<key>Title</key>
<string>Mantle (4c1a09c)</string>
<string>Mantle (2.1.6)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -256,7 +246,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/MBProgressHUD</string>
<key>Title</key>
<string>MBProgressHUD (1.1.0)</string>
<string>MBProgressHUD (1.2.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -268,14 +258,6 @@
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/Navajo</string>
<key>Title</key>
<string>Navajo (0.0.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/NBUCore</string>
@ -288,7 +270,15 @@
<key>File</key>
<string>com.mono0926.LicensePlist/OpenSSL</string>
<key>Title</key>
<string>OpenSSL (1.0.2n)</string>
<string>OpenSSL (1.1.1c)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/OTRAssets</string>
<key>Title</key>
<string>OTRAssets (0.1.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -296,7 +286,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/OTRKit</string>
<key>Title</key>
<string>OTRKit (2.0.0)</string>
<string>OTRKit (3.0.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -304,7 +294,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/ParkedTextField</string>
<key>Title</key>
<string>ParkedTextField (0.4.0)</string>
<string>ParkedTextField (1.0.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -320,7 +310,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/PureLayout</string>
<key>Title</key>
<string>PureLayout (v3.0.2)</string>
<string>PureLayout (3.1.8)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -332,19 +322,11 @@
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/Reveal-SDK</string>
<key>Title</key>
<string>Reveal-SDK (13)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/SAMKeychain</string>
<key>Title</key>
<string>SAMKeychain (v1.5.3)</string>
<string>SAMKeychain (1.5.3)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -352,7 +334,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/SignalProtocolC</string>
<key>Title</key>
<string>SignalProtocolC (2.3.1)</string>
<string>SignalProtocolC (2.3.2)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -360,7 +342,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/SignalProtocolObjC</string>
<key>Title</key>
<string>SignalProtocolObjC (1.0.0)</string>
<string>SignalProtocolObjC (1.1.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -368,7 +350,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/SQLCipher</string>
<key>Title</key>
<string>SQLCipher (3.4.2)</string>
<string>SQLCipher (4.4.3)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -376,7 +358,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/Tor</string>
<key>Title</key>
<string>Tor (0.3.0.13)</string>
<string>Tor (0.4.0.5)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -388,19 +370,11 @@
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/TUSafariActivity</string>
<key>Title</key>
<string>TUSafariActivity (1.0.4)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
<dict>
<key>File</key>
<string>com.mono0926.LicensePlist/XLForm</string>
<key>Title</key>
<string>XLForm (4.0.0)</string>
<string>XLForm (4.3.0)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -408,7 +382,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/XMPPFramework</string>
<key>Title</key>
<string>XMPPFramework (4.0)</string>
<string>XMPPFramework (4.1.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -416,7 +390,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/YapDatabase</string>
<key>Title</key>
<string>YapDatabase (3.0.2)</string>
<string>YapDatabase (4.0.1)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>
@ -432,7 +406,7 @@
<key>File</key>
<string>com.mono0926.LicensePlist/ZXingObjC</string>
<key>Title</key>
<string>ZXingObjC (3.2.2)</string>
<string>ZXingObjC (3.6.5)</string>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
</dict>

View File

@ -6,7 +6,7 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2011-2016 Alamofire Software Foundation (http://alamofire.org/)
<string>Copyright (c) 2011-2020 Alamofire Software Foundation (http://alamofire.org/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -6,7 +6,7 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
<string>Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2013 Claudiu-Vlad Ursache
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
--
ENCRYPTION NOTICE / APP DISTRIBUTION NOTES
This software uses strong cryptography and may it fall under certain
export/import and/or use restrictions in some other parts of the world.
BEFORE using any encryption software, please check your country's laws,
regulations and policies concerning the import, possession, or use,
and re-export of encryption software, to see if this is permitted.
See http://www.wassenaar.org/ for more information.
This source package does not directly contain encryption software. Please see
the OpenSSL, libevent, and Tor license portions for links to the encryption-containing
portions of this application. Distributions of this source package
(and only this source package, without external dependencies) may not be
considered encryption software depending on the regulations of your jurisdiction.
Distribution of binary versions of this application may be subject to
further export/import and/or use restrictions. (iOS developers: see the
"My application uses a public domain library (openssh)..." question in the
"World Wide Trade Compliance for the App Store" page on the Apple iTunes Connect
FAQs[3] site. Also note the "I intend to distribute my app only in the United
States and Canada..." question on that FAQ page.)
[3]: https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wa/jumpTo?page=faqs
--
OpenSSL is not bundled in the source tree of this application, but is required
to compile the library. NOTE: Binary forms of this application are subject
to the license and must reproduce the copyright notices and disclaimers
located in the full license (link below).
OpenSSL is available under the OpenSSL License License &amp; Original SSLeay License:
Copyright (c) 1998-2011 The OpenSSL Project.
Full license available at:
https://www.openssl.org/source/license.html
--
Libevent is not bundled in the source tree of this application, but is required
to compile the library. NOTE: Binary forms of this application are subject
to the license and must reproduce the copyright notices and disclaimers
located in the full license (link below).
Libevent is available for use under the following license, commonly known
as the 3-clause (or "modified") BSD license:
Copyright (c) 2000-2007 Niels Provos &lt;provos@citi.umich.edu&gt;
Copyright (c) 2007-2010 Niels Provos and Nick Mathewson
Full license available at:
http://libevent.org/LICENSE.txt
--
Tor is not bundled in the source tree of this application, but is required
to compile the library. NOTE: Binary forms of this application are subject
to the license and must reproduce the copyright notices and disclaimers
located in the full license (link below).
Tor is available under a BSD-style license:
Copyright (c) 2001-2004, Roger Dingledine
Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
Copyright (c) 2007-2013, The Tor Project, Inc.
Full license available at:
https://gitweb.torproject.org/tor.git?a=blob_plain;hb=HEAD;f=LICENSE</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>ChatSecure, an OTR-compatible iOS encrypted chat client
Copyright (C) 2012, Chris Ballinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
If you would like to relicense this code to sell it on the App Store,
please contact me at chris@chatsecure.org.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -6,24 +6,21 @@
<array>
<dict>
<key>FooterText</key>
<string>Software License Agreement (BSD License)
<string>BSD 3-Clause License
Copyright (c) 2010-2016, Deusty, LLC
Copyright (c) 2010-2021, Deusty, LLC
All rights reserved.
Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following conditions are met:
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Neither the name of Deusty nor the names of its
contributors may be used to endorse or promote products
derived from this software without specific prior
written permission of Deusty, LLC.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>

View File

@ -6,7 +6,7 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 20112015 Mattt Thompson (http://mattt.me/)
<string>Copyright (c) 20112019 Mattt Thompson (http://mattt.me/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2012 Karl Stenerud
Licencing: MIT (https://opensource.org/licenses/MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in the documentation of any redistributions of the template files themselves (but not in projects built using the templates).
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -6,7 +6,9 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2014 Mattt Thompson (http://mattt.me/)
<string>MIT License
Copyright (c) 2017 Masayuki Ono
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@ -15,16 +17,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>

View File

@ -6,7 +6,7 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright © 2009-2016 Matej Bukovinski
<string>Copyright © 2009-2020 Matej Bukovinski
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -13,11 +13,19 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
**This project uses portions of code from the Proton framework.**
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>**This project uses portions of code from the Proton framework.**
**Proton is copyright (c) 2012, Bitswift, Inc.**
**All rights reserved.**

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>ChatSecure, an OTR-compatible iOS encrypted chat client
Copyright (C) 2012, Chris Ballinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
If you would like to relicense this code to sell it on the App Store,
please contact me at chris@chatsecure.org.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string># REVEAL LICENSE AGREEMENT v2.0
## NOTICE TO USER:
This is a legally enforceable agreement between you (__"you"__ or __"yours"__ and other grammatical equivalents) and Itty Bitty Apps Pty. Ltd. (__"the Company"__), which covers your use of the Reveal software product that accompanies this Agreement and related software components, which may include associated media, printed materials, and "online" or electronic documentation. All such software and materials are referred to herein as the __"Software"__ or __"the Reveal Software"__. If you do not agree to the terms of this License Agreement, then do not install or use the Software. By explicitly accepting this License Agreement, or by installing, copying, downloading, accessing, or otherwise using the Software, you are acknowledging and agreeing to be bound by the following terms:
## 1. DEFINITIONS
__(a) "Software"__ shall mean the Reveal software including any Updates thereto, in object and source form, and the media and Documentation provided by the Company to you and for which you are granted a license pursuant to this Agreement.
__(b) "Documentation"__ shall mean the printed or online written reference material furnished to you in conjunction with the Software, including, without limitation, instructions, guidelines, and end user guides.
__(c) "Intellectual Property Rights"__ shall mean all intellectual property rights, including, without limitation, patent, copyright, trademark, and trade secret.
__(d) "Updates"__ shall mean a modification, error correction, bug fix, new release, or other update to or for the Software.
## 2. LICENSE GRANT
The Company may, at its sole discretion, grant you a Trial License, a Personal License, a Commercial Seat License, a Site License or an Enterprise License.
If you have not purchased or otherwise rightfully obtained a Personal License, a Commercial Seat License, a Site License or an Enterprise License for the Reveal Software, the Trial License Terms (2.1) are applicable to your use of the Reveal Software. The Trial License Terms are also applicable to any usage of the Reveal Software by you that is not covered under any other licenses you may have.
The Personal License Terms (2.2) apply if you have a Personal License. The Commercial Seat License Terms (2.3) apply if you have a Commercial Seat License. The Site License Terms (2.4) apply if you have a Site License. The Enterprise License Terms (2.5) apply if you have an Enterprise License.
The General Terms (3) apply in all cases.
### 2.1 TRIAL LICENSE TERMS
The Company grants you a non-exclusive license to use the Software for time-limited evaluation purposes, only in accordance with the terms and conditions set forth herein. The Software may be used for a period of 14 calendar days from the time of activation. Upon lapse of such trial period all of or part of the functionality of the Software will be disabled automatically.
If you wish to use the Software after the trial period, you must purchase a Personal License, a Commercial Seat License, a Site License or an Enterprise License. The Company may extend to you an expiring license key, in which event such a license key will be considered a means to extend the trial period under the Trial License Terms.
### 2.2 PERSONAL LICENSE TERMS
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License grants you the right to activate and use the Software on no more than 2 computers primarily used by you. Use of the Software under this license may be for both commercial and non-commercial purposes. Personal licences are not available to companies, commercial institutions, government agencies or business entities.
### 2.3 COMMERCIAL SEAT LICENSE TERMS
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours. A Commercial Seat License must be purchased for every person employed by you or employed by any fully owned subsidiary of yours wishing to use the Software.
This license is granted exclusively on a per-employee basis within your organisation and is not transferable to another current employee without written permission. This License grants the right to activate and use the Software on no more than 2 computers used by the employee.
This License does not allow the use of the Software other than for business purposes of your company. If entering into a Commercial Seat License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
### 2.4 SITE LICENSE TERMS
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours.
Unless otherwise specified, any Site License you acquire from the Company is valid only for use at the business locations listed on your sales invoice.
This License does not allow the use of the Software other than for business purposes of your company. If entering into a Site License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
### 2.5 ENTERPRISE LICENSE TERMS
The Company grants you a non-exclusive license to use the Software, only in accordance with the terms and conditions set forth herein. This License is only available to companies, commercial institutions, government agencies and business entities.
This License does not allow the Software to be activated and used on computers that are not either a) owned by you, b) owned by any fully owned subsidiary of yours, c) owned by or operated primarily by your employees or employees of any fully owned subsidiary of yours.
This License allows global use of the Software by all employees or employees of any fully owned subsidiary of the company, commercial institution, government agency or business entity listed in your sales invoice.
This License does not allow the use of the Software other than for business purposes of your company. If entering into an Enterprise License you personally warrant that you have full legal authority to enter into this agreement on behalf of your employer.
## 3. GENERAL TERMS
### 3.1 TITLE
REVEAL™ and ITTY BITTY APPS™ represent proprietary common law trademarks owned by the Company and must not be used without written permission.
The Company shall own and retain all right, title and interest in and to all Intellectual Property Rights related to the Software, the Documentation and all improvements to any of them however so created. You do not acquire any other rights, express or implied, in the Software. ALL RIGHTS NOT EXPRESSLY GRANTED HEREUNDER ARE RESERVED TO THE COMPANY.
### 3.2 ARCHIVAL OR BACKUP COPIES
You may copy the Software for backup and archival purposes only, provided that the original and each copy is kept in your possession and that your installation and use of the Software does not exceed that allowed in the "License Grant" section above.
### 3.3 THINGS YOU MUST NOT DO
The Software and Documentation are protected by Australian and international copyright law. You must treat the Software and Documentation like any other copyrighted material—for example, a book. You may not:
* copy the Documentation,
* copy the Software except to make archival or backup copies as provided above,
* modify or adapt the Software or merge it into another program,
* reverse engineer, disassemble, decompile or make any attempt to discover the source code of the Software,
* place the Software onto a server so that it is accessible via a public network such as the Internet, or
* sublicense, rent, lease, sublicense or lend any portion of the Software or Documentation.
### 3.4 LIMITATION OF LICENSE VALIDITY
Any License to use the Software granted to you under this License Agreement is limited to the release of the Software available at the time of purchase plus all releases of the Software for 12 months from the time of purchase exclusively. The Company reserves the right to change the terms of this agreement in any future major or minor release of the software.
### 3.5 ONLINE ACTIVATION
The Software requires activation in order to use it under the terms of this agreement. If you do not activate the Software, all of or part of the functionality of the Software will disable automatically. The Company may at its sole discretion decide to adjust the exact technical conditions under which unactivated copies of the Software cease to work. You need an active, functional internet connection to activate your copy of the Software. Your licensed use of the Software is bound to the computer(s) you used to complete activation. You may need to reactivate your copy of the Software after replacing the logic board or otherwise changing the hardware configuration of your computer. You may need to contact the Company to complete reactivation.
### 3.6 ADDITIONAL SERVICES
Fees may apply for additional services and products offered by the company and others, such as services that integrate with the Software or extend the functionality of the Software.
### 3.7 TECHNICAL AND RELATED INFORMATION
The Company and its subsidiaries may collect and use technical and related information, such as technical information concerning your computer, system and application software. The Company does not collect (a) any information that identifies your work, (b) any file names or file contents of anything you work on using the Software. The Company and its subsidiaries are free to use the collected information in any form that does not personally identify you.
### 3.8 PRIVACY
The Company will not sell or in any way license usage of your personal information to third parties. The Company will make reasonable efforts to keep your personal information secure.
### 3.9 TRANSFERS
With prior notice to the Company, you may transfer all your rights to use the Software and Documentation only once and permanently to another person or legal entity provided you transfer this License Agreement, the Software and Documentation, including all copies, updates and prior versions to such person or entity and that you retain no copies, including copies stored on computer. The receiving person or legal entity must satisfy the conditions of the applicable license terms set out in section 2.
### 3.10 LIMITED WARRANTY
We warrant that for a period of 14 days after delivery of this copy of the Software to you the Software will perform in substantial accordance with the Documentation.
To the extent permitted by applicable law, THE FOREGOING LIMITED WARRANTY IS IN LIEU OF ALL OTHER WARRANTIES OR CONDITIONS, EXPRESS OR IMPLIED, AND WE DISCLAIM ANY AND ALL IMPLIED WARRANTIES OR CONDITIONS, INCLUDING ANY IMPLIED WARRANTY OF TITLE, NONINFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, regardless of whether we know or had reason to know of your particular needs. No employee, agent, dealer or distributor of ours is authorized to modify this limited warranty, nor to make any additional warranties.
SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
### 3.11 LIMITED REMEDY
Our entire liability and your exclusive remedy for breach of the foregoing warranty shall be, at our option, to return the price you paid minus fees incurred to transfer those funds to you.
IN NO EVENT WILL WE BE LIABLE TO YOU FOR ANY DIRECT OR INDIRECT DAMAGES, INCLUDING ANY LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING FROM THE USE OR THE INABILITY TO USE THE SOFTWARE (EVEN IF WE OR AN AUTHORIZED DEALER OR DISTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF THESE DAMAGES), OR FOR ANY CLAIM BY ANY OTHER PARTY.
SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
### 3.12 TERM AND TERMINATION
This license agreement takes effect upon your use of the software and remains effective until terminated. You may terminate it at any time by destroying all copies of the Software and Documentation in your possession. It will also automatically terminate if you fail to comply with any term or condition of this license agreement. You hereby agree that on termination of this license to permanently destroy all copies of the Software and Documentation in your possession.
### 3.13 CONFIDENTIALITY
The Software contains trade secrets and proprietary know-how that belong to the Company and it is being made available to you in strict confidence. ANY USE OR DISCLOSURE OF THE SOFTWARE, OR OF ITS ALGORITHMS, PROTOCOLS OR INTERFACES, OTHER THAN IN STRICT ACCORDANCE WITH THIS LICENSE AGREEMENT, MAY BE ACTIONABLE AS A VIOLATION OF THE COMPANY'S TRADE SECRET RIGHTS.
### 3.14 GENERAL PROVISIONS
__3.14.1__ This written license agreement is the exclusive agreement between you and the Company concerning the Software and Documentation and supersedes any prior purchase order, communication, advertising or representation concerning the Software.
__3.14.2__ This is the entire agreement between the parties relating to the subject matter hereof and all other terms are rejected. No waiver or modification of this Agreement shall be valid unless in writing signed by each party. The waiver of a breach of any term hereof shall in no way be construed as a waiver of any term or other breach hereof. If any provision of this Agreement is held by a court of competent jurisdiction to be contrary to law the remaining provisions of this Agreement shall remain in full force and effect.
__3.14.3__ In the event of litigation between you and the Company concerning the Software or Documentation, the prevailing party in the litigation will be entitled to recover attorney fees and expenses from the other party.
__3.14.4__ This Agreement, and all disputes arising out of or related thereto, shall be governed by and construed under the laws of the State of Victoria, Australia, without reference to conflict of laws principles. All such disputes shall be subject to the exclusive jurisdiction of the state and federal courts located in Australia, and the parties agree and submit to the personal and exclusive jurisdiction and venue of these courts.
## 4. CONTACT INFORMATION
If you have any questions about this License Agreement, or if you want to contact the Company for any reason, please direct all mail correspondence to: Itty Bitty Apps Pty. Ltd. Level 6, 84 William St, Melbourne, Victoria, Australia, 3000, or electronic correspondence to info@ittybittyapps.com.
Do you agree to be bound by the terms of this agreement?</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -6,7 +6,7 @@
<array>
<dict>
<key>FooterText</key>
<string> Copyright 2015-2016 Open Whisper Systems
<string> Copyright 2015-2016 Open Whisper Systems
Licensed under the GPLv3: http://www.gnu.org/licenses/gpl-3.0.html

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2012 ThinkUltimate (http://thinkultimate.com).
http://github.com/davbeck/TUSafariActivity
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -291,11 +291,19 @@ src/ext/mulodi4.c is distributed under this license:
license. As a contributor, you agree to allow your code to be
used under both.
Full text of the relevant licenses is included below.
=========================================================================
University of Illinois/NCSA
Full text of the relevant licenses is included below.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string> University of Illinois/NCSA
Open Source License
Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
@ -340,11 +348,19 @@ src/ext/mulodi4.c is distributed under this license:
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS WITH THE SOFTWARE.
=========================================================================
Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
OTHER DEALINGS WITH THE SOFTWARE.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string> Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation

View File

@ -10,11 +10,19 @@
This class is released under the public domain.
Originally created by Robbie Hanson in Q3 2010.
Updated and maintained by Deusty LLC and the Mac/iOS development community.
------------------------------------------------------------
CocoaLumberjack: (BSD Style License)
Updated and maintained by Deusty LLC and the Mac/iOS development community.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>CocoaLumberjack: (BSD Style License)
Copyright (c) 2010, Deusty, LLC
All rights reserved.
@ -31,11 +39,19 @@ with or without modification, are permitted provided that the following conditio
derived from this software without specific prior
written permission of Deusty, LLC.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------------------------------------------------------------
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>
XMPPStream and all other source code: (BSD Style License)
Software License Agreement (BSD License)

View File

@ -1,217 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -1,217 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
</dict>
</plist>

View File

@ -58,11 +58,19 @@ ht-internal.h:
Copyright (c) 2002 Christopher Clark
minheap-internal.h:
Copyright (c) 2006 Maxim Yegorushkin &lt;maxim.yegorushkin@gmail.com&gt;
==============================
The arc4module is available under the following, sometimes called the
Copyright (c) 2006 Maxim Yegorushkin &lt;maxim.yegorushkin@gmail.com&gt;</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>The arc4module is available under the following, sometimes called the
"OpenBSD" license:
Copyright (c) 1996, David Mazieres &lt;dm@uun.org&gt;

View File

@ -28,11 +28,19 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================
Libidn COPYING -- Explanation of licensing conditions.
THE SOFTWARE.</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>----------------------------------------</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Libidn COPYING -- Explanation of licensing conditions.
Copyright (C) 2002-2015 Simon Josefsson
See the end for copying conditions.

View File

@ -6,7 +6,8 @@
<array>
<dict>
<key>FooterText</key>
<string>Copyright 2017. Arash Payan. This library is distributed under the terms of the MIT/X11.</string>
<string>liblzma is in the public domain.
</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>

View File

@ -0,0 +1 @@
EXPORT_COMPLIANCE_CODE=51d17d3e-5e07-49ad-a308-9625d81e411f

View File

@ -0,0 +1 @@
EXPORT_COMPLIANCE_CODE=51d17d3e-5e07-49ad-a308-9625d81e411f

View File

@ -0,0 +1 @@
EXPORT_COMPLIANCE_CODE=da55f6b4-d796-422f-9566-c5188326ac49

View File

@ -0,0 +1 @@
EXPORT_COMPLIANCE_CODE=da55f6b4-d796-422f-9566-c5188326ac49

85
ChatSecureCore.podspec Normal file
View File

@ -0,0 +1,85 @@
Pod::Spec.new do |s|
s.name = 'ChatSecureCore'
s.version = '1.0.0'
s.summary = 'A short description of ChatSecureCore.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/ChatSecure/ChatSecure-iOS'
s.license = { :type => 'GPLv3', :file => 'LICENSE' }
s.author = { 'Chris Ballinger' => 'chris@chatsecure.org' }
s.source = { :git => 'https://github.com/ChatSecure/ChatSecureCore.git', :tag => s.version.to_s }
s.social_media_url = 'https://twitter.com/ChatSecure'
s.ios.deployment_target = '9.0'
# s.subspec 'Source' do |ss|
# ss.source_files = ['ChatSecure/Classes/**/*.{h,m,swift}', 'ChatSecureCore/**/*.h']
# ss.public_header_files = ['ChatSecureCore/ChatSecureCore.h',
# 'ChatSecureCore/Public/*.h',]
# ss.private_header_files = ['ChatSecureCore/Private/*.h']
# ss.xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DSQLITE_HAS_CODEC' }
# ss.frameworks = ['UIKit', 'StoreKit']
# end
s.module_name = 'ChatSecureCorePod'
# User Interface
s.dependency 'OpenInChrome', '~> 0.0'
s.dependency 'JTSImageViewController', '~> 1.4'
s.dependency 'BButton', '~> 4.0'
s.dependency 'ARChromeActivity', '~> 1.0'
s.dependency 'QRCodeReaderViewController', '~> 4.0'
s.dependency 'ParkedTextField', '~> 1.0'
s.dependency 'JSQMessagesViewController'
s.dependency 'LumberjackConsole'
# Utility
s.dependency 'CocoaLumberjack/Swift', '~> 3.7'
s.dependency 'MWFeedParser', '~> 1.0'
s.dependency 'BBlock', '~> 1.2'
s.dependency 'LicensePlist'
# Network
s.dependency 'CocoaAsyncSocket', '~> 7.6.0'
s.dependency 'ProxyKit/Client', '~> 1.2.0'
s.dependency 'GCDWebServer', '~> 3.4'
# s.dependency 'CPAProxy'
s.dependency 'XMPPFramework/Swift'
s.dependency 'ChatSecure-Push-iOS'
s.dependency 'SQLCipher', '~> 4.4'
s.dependency 'YapDatabase/SQLCipher', '~> 4.0'
s.dependency 'libsqlfs/SQLCipher'
s.dependency 'IOCipher/GCDWebServer'
s.dependency 'YapTaskQueue/SQLCipher'
# Crypto
s.dependency 'SignalProtocolObjC'
s.dependency 'OTRKit'
s.dependency 'Alamofire', '~> 5.0'
s.dependency 'Kvitto', '~> 1.0'
s.dependency "Mantle"
s.dependency "HTMLReader", '~> 2.1.1'
s.dependency "AFNetworking/Security", '~> 4.0'
s.dependency "ZXingObjC/QRCode", '~> 3.6'
s.dependency "SAMKeychain", '~> 1.5'
s.dependency "MBProgressHUD", '~> 1.1'
s.dependency "TTTAttributedLabel", '~> 2.0'
s.dependency "PureLayout", '~> 3.0'
s.dependency "KVOController", '~> 1.2'
s.dependency "XLForm", '~> 4.1'
s.dependency "FormatterKit/TimeIntervalFormatter", '~> 1.8'
s.dependency "FormatterKit/UnitOfInformationFormatter", '~> 1.8'
s.dependency "OTRAssets"
end

View File

@ -34,7 +34,6 @@ FOUNDATION_EXPORT const unsigned char ChatSecureCoreVersionString[];
#import "OTRDatabaseManager.h"
#import "OTRAppDelegate.h"
#import "AppTheme.h"
#import "OTRPushTLVHandlerProtocols.h"
#import "OTREncryptionManager.h"
#import "OTRQRCodeActivity.h"
#import "OTRIncomingMessage.h"
@ -87,6 +86,8 @@ FOUNDATION_EXPORT const unsigned char ChatSecureCoreVersionString[];
#import "OTRXMPPRoomManager.h"
#import "OTRQRCodeReaderDelegate.h"
#import "OTRBuddyApprovalCell.h"
#import "RoomOccupantRole.h"
#import "OTRImageItem.h"
#import "OTRAudioItem.h"

View File

@ -9,14 +9,14 @@
import Foundation
public extension NSData {
extension NSData {
@objc public func hexString() -> String {
return (self as Data).hexString()
}
}
// http://stackoverflow.com/a/26502285/805882
public extension NSString {
extension NSString {
/// Create `Data` from hexadecimal string representation
///

View File

@ -10,6 +10,7 @@
#import "OTRConstants.h"
@import XMPPFramework;
@import OTRAssets;
#import "ChatSecureCoreCompat-Swift.h"
@implementation NSURL (ChatSecure)
@ -197,7 +198,7 @@
view = sender;
}
UIAlertAction *visitURL = [UIAlertAction actionWithTitle:OPEN_IN_SAFARI() style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:self];
[[UIApplication sharedApplication] open:self];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:CANCEL_STRING() style:UIAlertActionStyleCancel handler:nil];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:self.absoluteString message:nil preferredStyle:UIAlertControllerStyleActionSheet];
@ -211,12 +212,4 @@
[viewController presentViewController:alert animated:YES completion:nil];
}
@end
@implementation UIViewController (ChatSecureURL)
- (void) promptToShowURL:(NSURL*)url sender:(id)sender {
[url promptToShowURLFromViewController:self sender:sender];
}
@end

View File

@ -8,7 +8,6 @@
#import "UIActivity+ChatSecure.h"
@import ARChromeActivity;
@import TUSafariActivity;
#import "OTROpenInFacebookActivity.h"
#import "OTROpenInTwitterActivity.h"
@import OTRAssets;
@ -16,22 +15,21 @@
@implementation UIActivity (ChatSecure)
+ (NSArray<UIActivity*>*) otr_linkActivities {
TUSafariActivity *safariActivity = [TUSafariActivity new];
ARChromeActivity *chromeActivity = [ARChromeActivity new];
chromeActivity.activityTitle = OPEN_IN_CHROME();
chromeActivity.callbackURL = [NSURL URLWithString:@"chatsecure://"];
OTROpenInTwitterActivity *twitterActivity = [OTROpenInTwitterActivity new];
OTROpenInFacebookActivity *facebookActivity = [OTROpenInFacebookActivity new];
NSArray *applicationActivites = @[twitterActivity,facebookActivity,safariActivity,chromeActivity];
NSArray *applicationActivites = @[twitterActivity,facebookActivity,chromeActivity];
return applicationActivites;
}
+ (CGSize)otr_defaultImageSize
{
CGSize size = CGSizeZero;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
size = CGSizeMake(43, 43);
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
} else if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
size = CGSizeMake(55, 55);
}
return size;

View File

@ -8,7 +8,6 @@
#import "UIActivityViewController+ChatSecure.h"
@import ARChromeActivity;
@import TUSafariActivity;
#import "OTROpenInFacebookActivity.h"
#import "OTROpenInTwitterActivity.h"
@import OTRAssets;

View File

@ -49,7 +49,7 @@ extension NotificationType: RawRepresentable {
public typealias RawValue = String
}
public extension UIApplication {
extension UIApplication {
/// Removes all but one foreground notifications for typing and message events sent from APNS
@objc public func removeExtraForegroundNotifications() {
@ -138,7 +138,7 @@ public extension UIApplication {
let chatString = WANTS_TO_CHAT_STRING()
let text = "\(name) \(chatString)"
let unreadCount = self.applicationIconBadgeNumber + 1
self.showLocalNotificationWith(identifier: nil, body: text, badge: unreadCount, userInfo: [kOTRNotificationType:kOTRNotificationTypeSubscriptionRequest], recurring: false)
self.showLocalNotificationWith(groupingIdentifier: nil, body: text, badge: unreadCount, userInfo: [kOTRNotificationType:kOTRNotificationTypeSubscriptionRequest], recurring: false)
}
}
@ -158,28 +158,26 @@ public extension UIApplication {
let userInfo:[AnyHashable:Any] = [kOTRNotificationThreadKey:identifier,
kOTRNotificationThreadCollection:thread.threadCollection,
kOTRNotificationType: kOTRNotificationTypeApprovedBuddy]
self.showLocalNotificationWith(identifier: identifier, body: message, badge: unreadCount, userInfo: userInfo, recurring: false)
self.showLocalNotificationWith(groupingIdentifier: nil, body: message, badge: unreadCount, userInfo: userInfo, recurring: false)
}
}
internal func showLocalNotificationFor(_ thread:OTRThreadOwner?, text:String, unreadCount:Int) {
if let thread = thread, thread.isMuted { return } // No notifications for muted
DispatchQueue.main.async {
var identifier:String? = nil
var userInfo:[AnyHashable:Any]? = nil
if let t = thread {
identifier = t.threadIdentifier
userInfo = [kOTRNotificationThreadKey:t.threadIdentifier,
kOTRNotificationThreadCollection:t.threadCollection,
kOTRNotificationType: kOTRNotificationTypeChatMessage]
}
self.showLocalNotificationWith(identifier: identifier, body: text, badge: unreadCount, userInfo: userInfo, recurring: false)
self.showLocalNotificationWith(groupingIdentifier: nil, body: text, badge: unreadCount, userInfo: userInfo, recurring: false)
}
}
@objc public func showLocalNotificationWith(identifier:String?, body:String, badge:Int, userInfo:[AnyHashable:Any]?, recurring:Bool) {
@objc public func showLocalNotificationWith(groupingIdentifier:String?, body:String, badge:Int, userInfo:[AnyHashable:Any]?, recurring:Bool) {
DispatchQueue.main.async {
if recurring, self.hasRecurringLocalNotificationWith(identifier: identifier) {
if recurring, self.hasRecurringLocalNotificationWith(identifier: groupingIdentifier) {
return // Already pending
}
// Use the new UserNotifications.framework on iOS 10+
@ -187,9 +185,9 @@ public extension UIApplication {
let localNotification = UNMutableNotificationContent()
localNotification.body = body
localNotification.badge = NSNumber(integerLiteral: badge)
localNotification.sound = UNNotificationSound.default()
if let identifier = identifier {
localNotification.threadIdentifier = identifier
localNotification.sound = UNNotificationSound.default
if let threadKey = userInfo?[kOTRNotificationThreadKey] as? String {
localNotification.threadIdentifier = threadKey
}
if let userInfo = userInfo {
localNotification.userInfo = userInfo
@ -201,7 +199,7 @@ public extension UIApplication {
date.minute = 0
trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
}
let request = UNNotificationRequest(identifier: UUID().uuidString, content: localNotification, trigger: trigger) // Schedule the notification.
let request = UNNotificationRequest(identifier: groupingIdentifier ?? UUID().uuidString, content: localNotification, trigger: trigger) // Schedule the notification.
let center = UNUserNotificationCenter.current()
center.add(request, withCompletionHandler: { (error: Error?) in
if let error = error as NSError? {
@ -282,9 +280,9 @@ public extension UIApplication {
let username = account.username
var body = "\(CONNECTION_ERROR_STRING()) \(username)."
if error.domain == GCDAsyncSocketErrorDomain,
let code = GCDAsyncSocketError(rawValue: error.code) {
let code = GCDAsyncSocketError.Code.init(rawValue: error.code) {
switch code {
case .noError,
.connectTimeoutError,
@ -298,6 +296,8 @@ public extension UIApplication {
case .otherError:
// this is probably a SSL error
body = body + " \(CONNECTION_ERROR_CERTIFICATE_VERIFY_STRING())"
@unknown default:
return
}
} else if error.domain == "kCFStreamErrorDomainSSL" {
body = body + " \(CONNECTION_ERROR_CERTIFICATE_VERIFY_STRING())"
@ -325,19 +325,12 @@ public extension UIApplication {
let userInfo = [kOTRNotificationType: kOTRNotificationTypeConnectionError,
kOTRNotificationAccountKey: accountKey]
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().getDeliveredNotifications(completionHandler: { (notifications) in
// FIXME: this deduplication code doesn't seem to work
// if we are already showing a notification, let's not spam the user too much with more of them
for notification in notifications {
if notification.request.identifier == accountKey {
return
}
}
self.showLocalNotificationWith(identifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
})
} else {
showLocalNotificationWith(identifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
}
self.showLocalNotificationWith(groupingIdentifier: accountKey, body: body, badge: badge, userInfo: userInfo, recurring: false)
}
}
extension UIApplication {
@objc public func open(_ url: URL) {
open(url, options: [:], completionHandler: nil)
}
}

View File

@ -10,7 +10,7 @@ import Foundation
import UIKit
public extension UINavigationController {
extension UINavigationController {
@objc public func otr_baseViewContorllers() -> [UIViewController] {
var result:[UIViewController] = []

View File

@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface UITableView (ChatSecure)
/** deleteActionAlsoRemovesFromRoster is YES for the ChooseBuddy view, otherwise NO. Connection must be read-write */
+ (nullable NSArray<UITableViewRowAction *> *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection;
+ (nullable UISwipeActionsConfiguration *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection;
@end
NS_ASSUME_NONNULL_END

View File

@ -8,14 +8,14 @@
#import "UITableView+ChatSecure.h"
#import "OTRXMPPBuddy.h"
#import <ChatSecureCore/ChatSecureCore-Swift.h>
#import "ChatSecureCoreCompat-Swift.h"
#import "OTRXMPPManager_Private.h"
@import OTRAssets;
@implementation UITableView (ChatSecure)
/** Connection must be read-write */
+ (nullable NSArray<UITableViewRowAction *> *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection {
+ (nullable UISwipeActionsConfiguration *)editActionsForThread:(id<OTRThreadOwner>)thread deleteActionAlsoRemovesFromRoster:(BOOL)deleteActionAlsoRemovesFromRoster connection:(YapDatabaseConnection*)connection {
NSParameterAssert(thread);
NSParameterAssert(connection);
if (!thread || !connection) {
@ -33,22 +33,23 @@
archiveTitle = UNARCHIVE_ACTION_STRING();
}
UITableViewRowAction *archiveAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:archiveTitle handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
UIContextualAction *archiveAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:archiveTitle handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction * _Nonnull transaction) {
NSString *key = [thread threadIdentifier];
NSString *collection = [thread threadCollection];
id object = [transaction objectForKey:key inCollection:collection];
if (![object conformsToProtocol:@protocol(OTRThreadOwner)]) {
completionHandler(NO);
return;
}
id <OTRThreadOwner> thread = object;
thread.isArchived = !thread.isArchived;
[thread saveWithTransaction:transaction];
completionHandler(YES);
}];
}];
UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:DELETE_STRING() handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:DELETE_STRING() handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[OTRBaseMessage deleteAllMessagesForBuddyId:[thread threadIdentifier] transaction:transaction];
}];
@ -61,7 +62,7 @@
[connection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
account = [OTRAccount fetchObjectWithUniqueID:accountKey transaction:transaction];
}];
OTRXMPPManager *xmppManager = (OTRXMPPManager *)[OTRProtocolManager.shared protocolForAccount:account];
OTRXMPPManager *xmppManager = (OTRXMPPManager *)[[OTRProtocolManager sharedInstance] protocolForAccount:account];
if (room.roomJID) {
[xmppManager.roomManager leaveRoom:room.roomJID];
}
@ -70,6 +71,7 @@
//Delete database items
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[((OTRXMPPRoom *)thread) removeWithTransaction:transaction];
completionHandler(YES);
}];
} else if ([thread isKindOfClass:[OTRBuddy class]] && deleteActionAlsoRemovesFromRoster) {
OTRBuddy *dbBuddy = (OTRBuddy*)thread;
@ -80,11 +82,14 @@
[connection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[action saveWithTransaction:transaction];
[dbBuddy removeWithTransaction:transaction];
completionHandler(YES);
}];
} else {
completionHandler(NO);
}
}];
return @[deleteAction, archiveAction];
return [UISwipeActionsConfiguration configurationWithActions:@[deleteAction, archiveAction]];
}
@end

Some files were not shown because too many files have changed in this diff Show More